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);
}