ASP.NET MVC:隐藏的字段值不会使用HtmlHelper.Hidden呈现

我的应用程序发生了一些非常奇怪的事情:

我在ViewModel中有以下属性:

public int? StakeholderId { get; set; } 

它在部分视图中呈现如下:

 <%= Html.Hidden("StakeholderId", Model.StakeholderId) %> 

表单被提交,并且相关的控制器动作生成一个id并更新模型,然后返回与更新的模型相同的视图

我遇到的问题是,即使StakeholderId现在有值,隐藏的字段也没有任何第二次呈现的“value”属性。

如果我只是自己输出值,它会显示在页面上,所以我通过这样做来显示值:

 <input type="hidden" id="StakeholderId" name="stakeholderId" value="<%: Model.StakeholderId %>" /> 

但是很奇怪,助手没有拿起更新的值?

(我使用jQuery提交表单并将操作结果呈现为div,但是我已经检查过,并且在jQuery执行任何操作之前,我已经得到的html已经是错误的了,所以我不认为这跟这个有很大关系任何东西)

UPDATE

我已经发现,我也可以在我的控制器操作返回部分视图之前清除相关的ModelState键。

助手将首先查找POST的值并使用它们。 在发布表单时,它将会提取ID的旧值。 您的解决方法是正确的。

附录:多个HTML表单,例如,在网格中

作为这个问题的一个附加,有一点非常小心,就是在同一个页面上有多个表单,例如在一个网格中,比如使用Ajax.BeginForm生成一个表单。

你可能会试图写一些东西:

 @foreach (var username in Model.TutorUserNames) { <tr> <td> @Html.ActionLink(username, MVC.Admin.TutorEditor.Details(username)) </td> <td> @using (Ajax.BeginForm("DeleteTutor", "Members", new AjaxOptions { UpdateTargetId = "AdminBlock", OnBegin = "isValidPleaseWait", LoadingElementId = "PleaseWait" }, new { name = "DeleteTutorForm", id = "DeleteTutorForm" })) { <input type="submit" value="Delete" /> @Html.Hidden("TutorName", username) } </td> </tr> } 

这里的致命线是:

 @Html.Hidden("TutorName", username) 

…并打算使用TutorName作为您的行动的参数。 例如:

 public virtual ActionResult DeleteTutor(string TutorName){...} 

如果你这样做的话,那么令人讨厌的惊喜就是,像Darin Dimitrov解释的那样,Html.Hidden(“TutorName”,用户名)将呈现最后的POST值。 也就是说,不pipe你的循环如何,所有的项目都会被最后删除的Tutor的TutorName渲染出来!

Razor语法中的单词是用明确的input标签replace@ Html.Hidden调用:

 <input type="hidden" id="TutorName" name="TutorName" value='@username' /> 

这按预期工作。

即:

永远不要使用Html.Hidden通过一个参数返回到您的操作,当你在一个网格中使用多个表单!

最后警告:

在构build隐藏的input标签时,需要同时包含名称和编号,否则在撰写本文时(2011年2月)将无法正常工作。 当然不是在谷歌浏览器。 所有你得到的是一个空参数返回,如果你只有一个ID和没有名字属性。