在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标记。
注意事项:
View正在使用多个提交按钮。
View正在使用局部视图。目前,部分视图中没有内容,也没有使用它。
我无法看到这些会如何影响这个问题。以为我会提到它,以防万一。
问题:任何人都可以解释为什么HTML Helper不起作用了吗?
***** 更新 *****
感谢 Stephen Muecke 指出需要包含在我的问题中的内容。另外还要感谢你猜测我在做什么,但是我无法用它来表达。
我正在更新ActionMethod()中的View Model属性,并且当重新渲染相同的View时,View Model属性不会反映新值。 相反,它保留了它的初始值,而不是保留新值。
答案 0 :(得分:6)
虽然不是很明显,但我发现很难找到很多关于这个主题的文章,以便在过去为我澄清它,ASP.NET MVC中的默认行为如下:
如果您正在使用HTML帮助程序并且您正在呈现相同的视图以响应POST
,则假定您正在响应失败的表单验证。
因此,在POST
中设置之前的值将始终在ModelState的视图中呈现。
您有几个选择:
ModelState.Clear();
。不建议使用,因为框架没有这样设计。Post-Redirect-Get
模式并仅显示验证失败,因为框架已设计(如@StephenMuecke提及)。Request.Form
值并移除SomeViewModel someViewModel
参数。当你失去模型绑定的所有好处时,不建议这样做。ModelState.Remove
,不建议再次使用。我在此发现的最好的文章是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