【问题标题】:MVC Hidden field via HTML Helper in Form Post issue通过表单发布问题中的 HTML 助手的 MVC 隐藏字段
【发布时间】: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 标签。

注意事项:

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

  2. 视图正在使用局部视图。目前局部视图中没有内容,也没有对其进行任何处理。

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

问题:谁能解释为什么 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


【解决方案1】:

虽然不是很明显,而且我发现很难找到很多关于这个主题的文章来为我澄清过去,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,同样不推荐。

我在这方面找到的最好的文章是 Simon Ince 在 2010 年的文章:

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

Rick Strahl 的另一个:

ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes

【讨论】:

  • 我想在 HttpPost 的隐藏字段中显示值。 推荐的解决方案?不使用 HtmlHelpers 吗? HtmlHelpers 的自定义扩展?
  • 其他选项:[System.Web.Mvc.HiddenInput(DisplayValue = false)] 并使用 EditorFor ?
  • 手动生成隐藏字段编写一个自定义帮助器,它将使用您的模型的值,而不是正在发布的模型 stackoverflow.com/questions/4837744/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2018-06-08
  • 2011-04-19
相关资源
最近更新 更多