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は実際には元の連絡先と同じです(更新を実行すると、すべての変更が無視され、古いオブジェクトが返されます)。したがって、WebページのPostCodeを555から666に変更すると、updatedContact.PostCodeは555になります。デバッガーと、@Html.EditorFor(m=>m.PostCode)呼び出されたcshtmlファイルのビューでその値を確認し、すべての場所で古い値(更新されていない)を確認しました。問題は、返されたhtml(firebugおよびchrome devツールでnetからキャッチされたもの)に次のようなものがあることです。

<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 に答える