Html.HiddenFor以不同方式处理字符串和int

时间:2013-09-25 12:14:25

标签: asp.net-mvc asp.net-mvc-4 razor

我的模特:

    public class VerifyModel
    {
        public string PIN { get; set; }
        public int Attempts { get; set; }
    }

我的观点:

    @Html.HiddenFor(m => m.PIN)
    @Html.HiddenFor(m => m.Attempts)

在进入视图时,我检查Model.PINModel.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"/>

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

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

1 个答案:

答案 0 :(得分:4)

如果我已正确理解您的问题,那么在使用不正确的Attempts发回表单后,PIN没有增加问题。如果该假设是正确的,那么由于ModelState的工作方式,您遇到了这个问题。

问题的简短答案就是从您的行动中致电ModelState.Remove

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

    return View(model);
}

如果您想详细说明原因,请参阅ASP.NET MVC’s Html Helpers Render the Wrong Value!。摘录:

  

为什么?

     

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