1

我在 mvc4 操作中有一个标准形式。我使用 jQuery.post 在服务器上执行回发操作:

[HttpPost]
    public ActionResult ContactUpdate(ContactClass model)
    {
      var originalContact = contactService.Get(model.Id);

      if (ModelState.IsValid && TryUpdateModel(originalContact))
      {
        contactService.Update(originalContact);
      }

      var updatedContact = contactService.Get(model.Id);

      return PartialView("ContactView", updatedContact );
    }

这可以按预期工作,此处的代码仅用于说明,因为我的问题稍后会在请求中出现。我的联系服务还没有实现更新,所以 updatedContact 实际上与原始的相同(当您执行更新时,所有更改都将被忽略并返回旧对象)。因此,当我将网页中的即 PostCode 从 555 更改为 666 时,updatedContact.PostCode 为 555。我在调试器中检查了它的值,也在调用的 cshtml 文件中检查了它的值,@Html.EditorFor(m=>m.PostCode)并且在任何地方它都有旧值(未更新)。问题是返回的 html(从 firebug 和 chrome 开发工具中的网络捕获)具有:

<input class="text-box" id="PostCode" name="PostCode" type="text" value="666">

这种行为对于所有属性都是相同的,据我所知,没有输出缓存(即使是,它也是一个 POST 请求,因此应该绕过缓存)。当我刷新页面时,我得到“旧”值。

起初,我认为这是我的 ajaxSuccess 函数$("#myform").replaceWith(returnedText),但在仔细检查响应内容后,我确信问题出在返回的 html 中。这怎么可能?

这个错误现在造成了我的更新正在运行的错觉,如果它正在运行,我可能甚至都不知道它。这是一种潜在的危险行为,因为某些属性的值可能与发布到控制器的值不同,并且用户在更新后将无法看到它,因此我可能不得不刷新整个页面以解决问题。

4

1 回答 1

5

所有Html.助手都喜欢这些ModelState值而不是实际模型值。

如果您不想从“回发”操作返回更新的模型,则需要清除第ModelState一个:

[HttpPost]
public ActionResult ContactUpdate(ContactClass model)
{
  var originalContact = contactService.Get(model.Id);

  if (ModelState.IsValid && TryUpdateModel(originalContact))
  {
    contactService.Update(originalContact);
  }

  var updatedContact = contactService.Get(model.Id);

  this.ModelState.Clear();
  return PartialView("ContactView", updatedContact );
}

这篇文章很好的解释了mvc框架的这个特性。

于 2012-06-21T14:56:18.950 回答