如何解决ASP.NET Core TagHelper输入as-for呈现值属性在请求模型中保持原始值
我用asp.net core 3.1建立了一个简单的网页来重现问题。同一public class HomeController : Controller
{
// rendering form
[HttpGet]
public IActionResult Index()
{
var myForm = new MyForm();
myForm.Id = 100;
return View("index",myForm);
}
// after form post,rendering form with updated value.
[HttpPost]
public IActionResult Index(MyForm m)
{
m.Id = 200;
return View("index",m);
}
}
中有2个动作。
一个用于呈现html表单,另一个用于接收表单发布数据,然后再次呈现表单。
index.cshtml
我在@model MyForm
<div>
<form asp-controller="Home" asp-action="Index" method="post">
<span>@Model.Id</span>
<input type="text" asp-for="@Model.Id"/>
<button type="submit">Submit</button>
</form>
</div>
中使用asp.net core tag helper
<form method="post" action="/">
<span>100</span>
<input type="text" data-val="true"
data-val-required="The Id field is required."
id="Id" name="Id" value="100">
<button type="submit">Submit</button>
</form>
当我获取/ index时,一切都很好,范围内的@ Model.Id和输入值均为100
获取/ index的Http响应
<form method="post" action="/">
<span>200</span>
<input type="text" data-val="true"
data-val-required="The Id field is required."
id="Id" name="Id" value="100">
<button type="submit">Submit</button>
</form>
但是,当我发布表单时,我期望span和input的值都应该为200,但是span为200,form为100
POST的HTTP响应/ index输入为100
asp-for
我猜“ asp-for”选择从原始ModelState读取数据,而ModelState是在绑定模型时构建的。而不是读取用于传递Razor渲染的ViewModel。
有人知道为什么标记助手asp-for
会这样吗?如何避免这种行为并使var machine = CChar()
使用我在View(“ index”,m)中传递的模型
解决方法
我猜“ asp-for”选择从原始ModelState读取数据
是的,这是设计使然。默认TagHelper显示ModelState值而不是Model。
如果您想asp-for
显示更新的模型值,则可以在发布操作中添加ModelState.Clear();
。
public IActionResult Index(MyForm m)
{
ModelState.Clear();
m.Id = 200;
return View("index",m);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。