C# ASP.NET MVC:未使用HtmlHelper.Hidden呈现隐藏字段值
我的应用程序发生了一些非常奇怪的事情: 我的ViewModel中有以下属性:C# ASP.NET MVC:未使用HtmlHelper.Hidden呈现隐藏字段值,c#,.net,asp.net-mvc,html-helper,C#,.net,Asp.net Mvc,Html Helper,我的应用程序发生了一些非常奇怪的事情: 我的ViewModel中有以下属性: public int? StakeholderId { get; set; } 它在局部视图中渲染,如下所示: <%= Html.Hidden("StakeholderId", Model.StakeholderId) %> 表单将被提交,相关的控制器操作将生成一个id并更新模型,然后返回具有更新模型的相同视图 我遇到的问题是,隐藏字段的“value”属性在第二次渲染时没有任何内容,即使Stakeh
public int? StakeholderId { get; set; }
它在局部视图中渲染,如下所示:
<%= Html.Hidden("StakeholderId", Model.StakeholderId) %>
表单将被提交,相关的控制器操作将生成一个id并更新模型,然后返回具有更新模型的相同视图
我遇到的问题是,隐藏字段的“value”属性在第二次渲染时没有任何内容,即使StakeholderId现在有一个值
如果我只是单独输出值,它会显示在页面上,因此我让它通过执行以下操作来呈现值:
<input type="hidden" id="StakeholderId" name="stakeholderId" value="<%: Model.StakeholderId %>" />
但是很奇怪的是,助手没有拾取更新的值
(我正在使用jQuery提交表单并将操作结果呈现到div中,但我已经检查过了,在jQuery使用它之前,我得到的html已经是错误的,所以我认为这与任何事情都没有多大关系)
更新
后来我发现,在控制器操作返回部分视图之前,我还可以清除相关的ModelState键。助手将首先查找发布的值并使用它们。当您发布表单时,它将拾取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>
}
。。。并打算使用TutorName作为动作的参数。例如:
public virtual ActionResult DeleteTutor(string TutorName){...}
如果你这么做了,你会惊讶的发现Html.Hidden(“TutorName”,username)会像Darin Dimitrov解释的那样呈现最后发布的值。也就是说,不管你的循环是什么,所有的项目都会以上次删除的导师的名字呈现
Razor语法中的单词around是用显式输入标记替换@Html.Hidden调用:
<input type="hidden" id="TutorName" name="TutorName" value='@username' />
这正如预期的那样有效
即:
在网格中使用多个表单时,永远不要使用Html.Hidden将参数传递回操作强>
最后警告:
在构造隐藏的输入标记时,需要同时包含名称和id,并将其设置为相同的值,否则,在撰写本文时(2011年2月),它将无法正常工作。当然不是谷歌浏览器。如果您只有一个id而没有name属性,那么只会返回一个null参数。谢谢,这很违反直觉,不是吗?如果我在value参数中传递一个具体的值,我肯定希望它被发出,否则我会完全忽略它?我想知道这种设计的原因是什么…@veli-原因是允许您输入“默认值”或“初始值”,但如果它不重新显示提交的值,那么在重新显示页面时,如果出现错误,您将丢失所有发布的数据。更具体地说,它寻找的是ModelState值,而不是post值。如果您从ModelState中删除,那么它将不会有这种行为。请您发布一个链接到一些关于这种行为的官方文档,好吗?Thanksher是在需要时将其放入控制器的实际代码,隐藏字段中的发布值将替换为控制器中设置的模型值。ModelState.Remove(“StakeholderId”);需要注意的一点是,在提交表单数据时,name属性是用来向服务器标识数据的属性,而不是id。
<input type="hidden" id="TutorName" name="TutorName" value='@username' />