为什么mvc Html.HiddenFor不会渲染我的字段?

mat*_*teo 16 asp.net-mvc-2

我想做这个简单的事情

<%= Html.HiddenFor(model => model.Id)%>
Run Code Online (Sandbox Code Playgroud)

这个模型是

[HiddenInput(DisplayValue=true)]
public int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

但我总是得到这个渲染

<input type="hidden" value="0" name="UserInfo.Id" id="UserInfo_Id">
Run Code Online (Sandbox Code Playgroud)

我检查并且ID不是0 ..?!

这里需要一些解释......

编辑

问题似乎是下面提到的帖子.这很有效

<input type="hidden" value="<%= Html.AttributeEncode(Model.Id) %>" id="<%= Html.IdFor(model=>model.Id)%>" name="<%= Html.NameFor(model=>model.Id)%>" />
Run Code Online (Sandbox Code Playgroud)

感谢Manaf

Man*_*ous 24

我不确定你是否就是这种情况,但是Html.HiddenFor()"如果在帖子期间更改了值,则不会在帖子后输出正确的值".这不是一个以这种方式设计的错误.

快速解决 :

不要使用帮助程序,请尝试以下方法:

<input type="hidden" value="<%= Html.AttributeEncode(model.Id) %>" id="Id" name="Id" />
Run Code Online (Sandbox Code Playgroud)

总是为我工作:)

  • *显然*这不是一个错误.不幸的是,这是我一直被抓住的东西:(另一个选择是在你的控制器动作中调用ModelState.Clear(); (3认同)

Tom*_*gan 5

要添加到Manaf的正确答案 - 您正确地注意到问题发生在处理帖子的控制器操作中.当我明确地将模型传递给视图时,我在控制器操作中遇到同样的问题处理get:

[HttpGet]
ActionResult SearchForSomething(SearchForm searchForm)
{
    searchForm.MyId = SomeValueFromSession;
    return View("SearchForSomething", searchForm);
}
Run Code Online (Sandbox Code Playgroud)

在视图中,为MyId呈现隐藏输入的这一行始终呈现为"0":

@Html.HiddenFor(m => m.MyId);
Run Code Online (Sandbox Code Playgroud)

根据Darren Oster的建议,我改为以下内容并修复了问题:

[HttpGet]
ActionResult SearchForSomething(SearchForm searchForm)
{
    searchForm.MyId = SomeValueFromSession;
    ModelState.Clear();
    return View("SearchForSomething", searchForm);
}
Run Code Online (Sandbox Code Playgroud)