0

これらの時間について読んでいるので、私の質問は一般的なシナリオだと思いますが、正直なところ、まだ疑問があります. これらのアクションを備えた単純なコントローラーがあります(これがPRGパターンに従っていることを理解している限り)

public ActionResult Index()
{
    var partyId = (int) Session["PartyId"];
    var viewModel = _displayBuilder.Build(partyId);
    return View(viewModel);
}

[HttpGet]
public ActionResult AddDocument()
{
    var partyId = (int) Session["PartyId"];
    var viewModel = _createBuilder.Build(partyId);
    return PartialView("_AddDocument", viewModel);
}
[HttpPost]
public ActionResult AddDocument(AddDocumentViewModel viewModel)
{
    var partyId = (int)Session["PartyId"];
    if (ModelState.IsValid)
    {
        _documentsManager.AddDocument(viewModel, partyId);
        return RedirectToAction("Index");
    }
    var newViewModel = _createBuilder.Rebuild(viewModel, partyId);
    return PartialView("_AddDocument", newViewModel);
}

そして、インデックスビューはこれを内部に保持します

<div id="addDocument">
    @{ Html.RenderAction("AddDocument"); }
</div>

プラスドキュメントのリスト。

post メソッドに記載されているように、部分ビューのみが表示されるため、サーバーの検証が失敗した場合に問題が発生します。インデックス ビューを表示できるようにしたいのですが、フォームの状態を失うことなく (modelstate を含めて、TempData でこれを渡すことができると思いますが、とにかく投稿されたフィールドの値を失うことになります)。

考えられる限り、私にできることはいくつかあります。

  1. すべてを同じビューに配置
  2. 私がやっていることの逆を行い、ドキュメントのリストを部分ビューとして作成します。
  3. フォームを ajax として作成します。これについてはよくわかりません。

足りないものはありますか?

私はこのページを可能な限り「賢くない」ままにしておき、当面は ajax を避けることを考えていました。これで、フォームを部分ビューで維持し、別のビューで再利用できると思います。ビューとそれを更新するためのリストの 2 つのパーシャルということですか?

ありがとう

4

1 に答える 1

0

結果を「新しい」ページとしてレンダリングしているため、Ajaxを使用せずにこれを回避する方法は本当にありません。

私が実際に考えることができる唯一の方法は、完全な「インデックス」と部分ビューをリロードすることですが、その場合、ajax を使用する方がはるかに簡単です。

このようなもの:

$.ajax({
    type: "POST",
    url: url,
    contentType: "application/json; charset=utf-8",
    data: data,
    dataType: "html",
    success: function (data) {
        $("#addDocument").html(data);
    }
});

そして、使用する代わりに

@{ Html.RenderAction("AddDocument"); }

使用する

@Html.Partial("_AddDocument")

お役に立てれば。

于 2013-04-24T06:50:00.180 に答える