Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC:未使用HtmlHelper.Hidden呈现隐藏字段值_C#_.net_Asp.net Mvc_Html Helper - Fatal编程技术网

C# ASP.NET MVC:未使用HtmlHelper.Hidden呈现隐藏字段值

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

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

我的ViewModel中有以下属性:

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' />