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

时间:2010-08-31 04:44:55

标签: asp.net-mvc-2

我正在尝试做这件简单的事情

<%= Html.HiddenFor(model => model.Id)%>

模型是

[HiddenInput(DisplayValue=true)]
public int Id { get; set; }

但我总是得到这个渲染

<input type="hidden" value="0" name="UserInfo.Id" id="UserInfo_Id">

我已经检查过,ID不是0 ..?!

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

编辑

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

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

感谢Manaf

4 个答案:

答案 0 :(得分:24)

我不确定你是否属于这种情况,但如果在帖子中更改了值,则Html.HiddenFor()“不会在帖子后输出正确的值。”这不是它设计的错误。

快速修复:

请勿使用帮助程序,请尝试此操作:

<input type="hidden" value="<%= Html.AttributeEncode(model.Id) %>" id="Id" name="Id" />

一直为我工作:)

答案 1 :(得分:5)

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

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

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

@Html.HiddenFor(m => m.MyId);

Per Darren Oster的建议我改为以下并解决了问题:

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

答案 2 :(得分:0)

我的评论被降级到最后一个地方(即使我找不到它),所以:

如果您不想清除模型状态,正如Darren Oster建议的那样,删除有问题的密钥对我有用:CheckboxList

答案 3 :(得分:0)

我和@ Html.HiddenFor一起遇到了这个问题。

@ Html.Hidden(“Id”,Model.Id)也给出了值0,但是外键字段,例如@ Html.Hidden(“Model_Category_ModelId”,Model.Category.ModelId)确实有效,而它@ Html.HiddenFor(m =&gt; m.Category.ModelId)没有。

我的解决方案是重定向到get操作,如ASP NET MVC Post Redirect Get Pattern中所述。