【问题标题】:State and ASP.NET MVC3状态和 ASP.NET MVC3
【发布时间】:2011-12-14 17:29:53
【问题描述】:

我有一个简单的 asp.net MVC 3 应用程序,其页面包含一个表单和一个 @Html.Hidden("hiddenField")。我正在通过 JavaScript 修改 hiddenField 的值,当表单根据输入提交时,我可能必须返回到同一个视图,但是当我这样做时,隐藏字段会预先填充帖子中的值。

这怎么可能。据我了解,程序员全权负责使用 asp.net MVC 维护状态。还是 Helper 类会根据请求值自动设置值?

【问题讨论】:

  • 它显然是在您提交时将您的隐藏字段保存到数据库中(这是预期的行为,如果您正确地构建了您的应用程序)。然后,当您返回同一个视图时,该视图会预填充数据库中的先前值。
  • 这里没有数据库保存,我不会返回默认视图。我正在从处理 HttpPost 的操作中返回 View()

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

这是因为当绑定 HTML 助手时,首先在 ModelState 中使用值,然后在模型中使用。因此,如果您打算修改已发布的 POST 控制器操作中的值,则需要将其从模型状态中删除。示例:

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    ModelState.Remove("SomePropertyThatYouWantToModify");
    model.SomePropertyThatYouWantToModify = "some new value";
    return View(model);
}

现在您的@Html.HiddenFor(x => x.SomePropertyThatYouWantToModify) 将呈现新值。

如果您使用 ViewData(但我真的希望您不是),为了我的回答的完整性:

[HttpPost]
public ActionResult Index(FormCollection form)
{
    ModelState.Remove("SomePropertyThatYouWantToModify");
    ViewData["SomePropertyThatYouWantToModify"] = "some new value";
    return View();
}

在您看来,@Html.Hidden("SomePropertyThatYouWantToModify") 应该呈现新值。

【讨论】:

  • 花了 3 个小时试图找出为什么它在我的示例中不起作用,从中取出 ModelState.Clear(),我知道它在那里是有原因的 :)
【解决方案2】:

这可能是模型绑定器问题。如果 @Html.Hidden("hiddenField") 调用生成的隐藏字段没有模型绑定器可以识别为模型属性的名称,它将使用由构建模型的任何进程填充的值(假设您是构建模型并仅更新您的视图发布的字段)。

根据您的示例,您的模型的属性名称必须是 hiddenField

【讨论】:

    【解决方案3】:

    我认为 MVC 3 处理此问题的方式存在问题。如果我在<h3>QuestionType: @Model.QuestionType</h3> 中显示我的模型值,它会显示新值。但在隐藏字段中,它具有旧值。 @Html.HiddenFor(m => m.QuestionType);

    我不会更新旧模型值并返回它。我正在创建一个全新的模型并在我的 post 方法中返回它作为回报 View(getNewModel())

    达林上面的回答确实解决了我的问题。我只是在返回视图之前使用ModelState.Clear(),一切似乎都正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2023-03-11
      • 2011-11-18
      • 2012-04-26
      • 2023-03-12
      • 2010-10-30
      • 2012-09-18
      相关资源
      最近更新 更多