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

时间:2015-06-10 13:10:11

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

在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; }
}

发布方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyActionMethod(SomeViewModel someViewModel, string command)
{
  ...
  ...
  // someViewModel.MyProperty1
  ...
  ...
}

查看

@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>
}

在上面的View代码中,HTML帮助程序隐藏字段(@ Html.HiddenFor(m =&gt; m.MyProperty1))执行 NOT 。但是HTML标签隐藏字段(输入类型=&#34;隐藏&#34; value=@Model.MyProperty1 name =&#34; MyProperty1&#34;) DOES 工作。我只启用了一个或另一个。这里显示的都是为了显示目的。

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

注意事项:

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

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

  3. 我无法看到这些会如何影响这个问题。以为我会提到它,以防万一。

    问题:任何人都可以解释为什么HTML Helper不起作用了吗?

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

    感谢 Stephen Muecke 指出需要包含在我的问题中的内容。另外还要感谢你猜测我在做什么,但是我无法用它来表达。

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

1 个答案:

答案 0 :(得分: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,不建议再次使用。
  6. 我在此发现的最好的文章是2010年Simon Ince的文章:

    ASP.NET MVC’s Html Helpers Render the Wrong Value!

    Rick Strahl的另一个人:

    ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes