在Form Post问题中通过HTML Helper的MVC隐藏字段

Tho*_*eil 2 c# asp.net asp.net-mvc razor asp.net-mvc-4

在MVC Form Post中使用隐藏字段时遇到问题.当通过HTML Helper生成隐藏字段时,它不会在回发期间保留它的值.但是当使用HTML标签时,它可以正常工作.

不幸的是,这个人花了我一整天的时间来完成这项工作.

这是我正在做的...(原谅任何拼写,重新输入的代码为SO):

查看模型

public class SomeViewModel
{
    public int MyProperty1 { get; set; }
    public int MyProperty2 { get; set; }
    public int MyProperty3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

发布方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyActionMethod(SomeViewModel someViewModel, string command)
{
  ...
  ...
  // someViewModel.MyProperty1
  ...
  ...
}
Run Code Online (Sandbox Code Playgroud)

视图

@using (Html.BeginForm("MyActionMethod", "SomeController", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()

    @Html.HiddenFor(m => m.MyProperty1)

    <div class="col-md-2">
        <input type="hidden" value=@Model.MyProperty1 name="MyProperty1" />
        <input type="submit" name="command" value="Button1" class="btn btn-primary" />
        <input type="submit" name="command" value="Button2" class="btn btn-success" />
    </div>
    <div class="col-md-1"></div>
    <div class="col-md-1">
        <input type="submit" name="command" value="Button3" class="btn btn-danger" />
    </div>
    <div class="col-md-8"></div>
}
Run Code Online (Sandbox Code Playgroud)

在上面的视图的代码中,HTML辅助隐藏字段(@ Html.HiddenFor(M => m.MyProperty1))不NOT工作.但是HTML标记隐藏字段(INPUT TYPE = "隐藏" value=@Model.MyProperty1 NAME = "MyProperty1")DOES工作.我只启用了一个或另一个.这里显示的都是为了显示目的.

我更喜欢使用HTML Helper语法,但可以使用HTML标记.

注意事项:

  1. View正在使用多个提交按钮.

  2. 视图使用局部视图.目前在局部视图中没有内容,也没有使用它.

我看不出这些会如何影响这个问题.以为我会提到它,以防万一.

问题:有谁可以解释为什么HTML Helper不起作用?


*****更新*****

感谢Stephen Muecke指出需要包含在我的问题中的内容.此外,还要感谢你猜测我实际在做什么,但我无法清楚地表达出来.

我正在更新ActionMethod()中的View Model属性,并且当重新呈现相同的View时,View Model属性不会反映新值.相反,它保留了它的初始值,而不是保留新值.

hut*_*oid 6

虽然不是很明显,但我发现很难找到很多关于这个主题的文章,以便在过去为我澄清它,ASP.NET MVC中的默认行为如下:

如果您正在使用HTML帮助程序并且您正在呈现相同的视图以响应POST它,则假定您正在响应失败的表单验证.因此,在设置之前的值POST将始终在ModelState的视图中呈现.

你有几个选择:

  1. ModelState.Clear();在你的帖子中.不推荐使用,因为框架没有这样设计.
  2. 使用Post-Redirect-Get模式并仅显示验证失败,因为框架是设计的(如@StephenMuecke提到的).
  3. 如果您对验证不感兴趣,请不要使用HtmlHelpers
  4. 请改用Request.Form值并删除SomeViewModel someViewModel参数.不推荐这个,因为你失去了模型绑定的所有好处.
  5. 使用ModelState.Remove的特定字段中,再次不推荐.

我在此发现的最好的文章是2010年Simon Ince的文章:

ASP.NET MVC的Html助手渲染错误的价值!

Rick Strahl的另一个:

ASP.NET MVC Postbacks和HtmlHelper控件忽略模型更改