首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC:不使用HtmlHelper.Hidden呈现隐藏字段值

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

Stack Overflow用户
提问于 2010-01-07 16:43:33
回答 2查看 69.6K关注 0票数 71

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

我的ViewModel中有以下属性:

代码语言:javascript
复制
public int? StakeholderId { get; set; }

它在局部视图中呈现,如下所示:

代码语言:javascript
复制
<%= Html.Hidden("StakeholderId", Model.StakeholderId) %>

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

我遇到的问题是,隐藏字段的" value“属性在第二次呈现时没有任何内容,即使StakeholderId现在有一个值。

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

代码语言:javascript
复制
<input type="hidden" id="StakeholderId" name="stakeholderId" value="<%: Model.StakeholderId %>" />

但是很奇怪的是,帮助器不获取更新值?

(我使用jQuery提交表单并将操作结果呈现到div中,但是我已经检查过了,在jQuery对其做任何处理之前,我得到的html已经是错误的,所以我不认为这与它有太多关系)

更新

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-07 16:52:17

帮助器将首先查找POSTed值并使用它们。当您发布表单时,它将采用ID的旧值。您的解决方法是正确的。

票数 61
EN

Stack Overflow用户

发布于 2011-02-01 18:53:16

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

作为这个问题的补充,有一件事要非常小心,那就是在同一页上有多个表单,例如,在一个网格中,比如说一个使用Ajax.BeginForm生成的表单。

你可能很想写一些类似这样的东西:

代码语言:javascript
复制
@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>
        }

这里的致命一句话是:

代码语言:javascript
复制
@Html.Hidden("TutorName", username)

..。并打算使用TutorName作为操作的参数。例如:

代码语言:javascript
复制
public virtual ActionResult DeleteTutor(string TutorName){...}

如果你这样做,你会遇到一个令人讨厌的惊喜,就像Darin Dimitrov解释的那样,Html.Hidden("TutorName",username)将呈现最后一个POSTed值。也就是说,不管你的循环是什么,所有的项目都会用上一个被删除的导师的TutorName来渲染!

在Razor语法中的用法是用一个显式的输入标记替换@Html.Hidden调用:

代码语言:javascript
复制
<input type="hidden" id="TutorName" name="TutorName" value='@username' />

这与预期的一样。

即:

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

最后的警告:

在构造隐藏的input标记时,您需要同时包含name和id,并将其设置为相同的值,否则,在撰写本文时(2011年2月),它将无法正常工作。当然不是在谷歌Chrome中。如果只有id而没有name属性,那么返回的只是一个空参数。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2019131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档