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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (90)

我的应用程序正在发生一些很奇怪的事情:

我的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已经是错误的,所以我认为这并不重要。任何东西)

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

提问于
用户回答回答于

助手将首先查找POSTed值并使用它们。当发布表单时,它会提取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){...}

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

围绕Razor语法的这个词是用一个明确的输入标签替换@ Html.Hidden调用:

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

这如预期的那样起作用。

永远不要,永远不要使用Html.Hidden在网格中使用多个表单时,将参数传回操作!!!

最后警告:

在构建隐藏的输入标签时,需要同时包含名称和编号,否则在撰写本文时(2011年2月)将无法正常工作。当然不在Google Chrome中。如果你只有一个id和没有name属性,所有你得到的是一个返回的null参数。

扫码关注云+社区

领取腾讯云代金券