【发布时间】:2015-08-25 18:20:57
【问题描述】:
在 MVC 表单帖子中使用隐藏字段时遇到问题。当通过 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 => m.MyProperty1)) 不 起作用。但是 HTML 标记隐藏字段 (input type="hidden" value=@Model.MyProperty1 name="MyProperty1") DOES 有效。我只启用了其中一个。此处显示的都是出于展示目的。
我更喜欢使用 HTML Helper 语法,但可以使用 HTML 标签。
注意事项:
视图正在使用多个提交按钮。
视图正在使用局部视图。目前局部视图中没有内容,也没有对其进行任何处理。
我看不出这些会如何影响问题。以为我会提到它,以防万一。
问题:谁能解释为什么 HTML Helper 不起作用?
***** 更新 *****
感谢 Stephen Muecke 指出我的问题中需要包含的内容。此外,非常感谢您猜到我实际上在做什么,但我无法表达出来。
我正在更新 ActionMethod() 中的 View Model 属性,当重新渲染同一个 View 时,View Model 属性不会反映新值。 而是保留它的初始值,而不是保留新值。
【问题讨论】:
-
当然可以。是什么让你认为它没有。或者您是否期望如果您更改 POST 方法中的属性并返回它将反映该更改的视图? - 它不会因为 html 帮助程序使用
ModelState值,而不是用于绑定的模型值 -
在浏览器中检查两者之间的实际差异。
-
你的问题和这个问题有什么区别? stackoverflow.com/questions/20657706/…
-
最好的猜测是您正在尝试更改值并返回视图,尽管您的问题没有说明这一点。 This answer 应该有助于解释这个问题。
-
那么你应该在问题中说清楚。阅读我在上面给出的解释行为的链接。但正确的做法是遵循 PRG 模式。
标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor