Html.HiddenFor 以不同的方式处理 string 和 int

Old*_*zer 4 asp.net-mvc razor asp.net-mvc-4

我的型号:

    public class VerifyModel
    {
        public string PIN { get; set; }
        public int Attempts { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我的看法:

    @Html.HiddenFor(m => m.PIN)
    @Html.HiddenFor(m => m.Attempts)
Run Code Online (Sandbox Code Playgroud)

在进入视图时,我检查Model.PIN并且Model.Attempts它们包含从控制器传递的正确值,其中Attempts非零。然而,呈现的 Html 是:

<input id="PIN" name="PIN" type="hidden" value="xxxx" />
<input data-val="true" value="0"  data-val-number="The field Attempts must be a number." data-val-required="The Attempts field is required." id="Attempts" name="Attempts" type="hidden"/>
Run Code Online (Sandbox Code Playgroud)

Attempts 的值始终为 0!而且我没有在任何地方指定该Attempts字段是强制性的。

如何解决模型中int属性的问题?

Joh*_*n H 5

如果我正确理解了您的问题,那么在Attempts表单以不正确的PIN. 如果该假设是正确的,那么您会因为 ModelState 的工作方式而遇到此问题。

问题的简短答案是简单地从您的操作中调用ModelState.Remove

[HttpPost]
public ActionResult YourAction(VerifyModel model)
{
    ModelState.Remove("Attempts");  
    model.Attempts++;  

    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解为什么会出现这种情况,请参阅ASP.NET MVC 的 Html Helpers Render the Wrong Value!. 摘抄:

为什么?

ASP.NET MVC 假设,如果您正在呈现视图以响应 HTTP POST,并且您正在使用 Html 帮助程序,那么您很可能会重新显示验证失败的表单。因此,Html Helpers 在查看模型之前实际上会检查 ModelState 以获取要显示在字段中的值。这使他们能够重新显示用户输入的错误数据,并在需要时显示匹配的错误消息。