ASP.NET 核心 TagHelper 输入 asp- 用于渲染值属性与请求模型中的原始值保持一致
ASP.NET Core TagHelper input asp-for rendering value attribute sticks with original value in request model
我用 asp.net 核心 3.1 构建了一个简单的网页来重现问题。同一个 HomeController.cs
.
中有 2 个动作
一个用于呈现 html 表单,另一个用于接收表单 post 数据然后再次呈现表单。
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);
}
}
我在index.cshtml
中使用asp.net core tag helper
@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>
当我 GET /index 时,一切正常,@Model.Id in span 和输入值都是 100
获取 /index 的 Http 响应
<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>
但是当我 post 表单时,我希望跨度和输入的值都应该是 200,但是跨度是 200,表单是 100
POST/index 输入为 100 的 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>
我猜“asp-for”选择从模型绑定时构建的原始 ModelState 读取数据。而不是读取传递给视图 Razor 渲染的 ViewModel。
有人知道为什么标记助手 asp-for
会这样吗?我应该如何避免这种行为并使 asp-for
使用我在 View("index", m)
中传递的模型
I guess "asp-for" choose to read data from original ModelState
是的,这是设计使然。默认 TagHelper 显示 ModelState 值而不是 Model。
如果您希望 asp-for
显示更新后的模型值,您可以在 post 操作中添加 ModelState.Clear();
。
public IActionResult Index(MyForm m)
{
ModelState.Clear();
m.Id = 200;
return View("index", m);
}
我用 asp.net 核心 3.1 构建了一个简单的网页来重现问题。同一个 HomeController.cs
.
一个用于呈现 html 表单,另一个用于接收表单 post 数据然后再次呈现表单。
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);
}
}
我在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>
当我 GET /index 时,一切正常,@Model.Id in span 和输入值都是 100
获取 /index 的 Http 响应
<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>
但是当我 post 表单时,我希望跨度和输入的值都应该是 200,但是跨度是 200,表单是 100
POST/index 输入为 100 的 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>
我猜“asp-for”选择从模型绑定时构建的原始 ModelState 读取数据。而不是读取传递给视图 Razor 渲染的 ViewModel。
有人知道为什么标记助手 asp-for
会这样吗?我应该如何避免这种行为并使 asp-for
使用我在 View("index", m)
I guess "asp-for" choose to read data from original ModelState
是的,这是设计使然。默认 TagHelper 显示 ModelState 值而不是 Model。
如果您希望 asp-for
显示更新后的模型值,您可以在 post 操作中添加 ModelState.Clear();
。
public IActionResult Index(MyForm m)
{
ModelState.Clear();
m.Id = 200;
return View("index", m);
}