2

これのすべての短いバージョンは、TempData を使用してフィードバック メッセージを保存し、CookieTempDataProvider の使用に切り替えた後、PRG パターンを使用すると表示されませんが、SessionTempDataProvider に戻すと表示されます。

私の MVC4 アプリケーションでは、作成/更新が成功した後、または特定のページで問題が発生し、失敗メッセージを表示する必要がある場合に、画面に表示するために一時データにアラート メッセージを書き込むパターンがあります。例えば...

[HttpPost, ValidateAntiForgeryToken]
public ActionResult Edit(PeopleEditFormModel model)
{
    if (!ModelState.IsValid)
        return RedirectToAction("Edit", new { id = model.ObjectId });
    try
    {
        var person = personService.UpdatePerson(model); // personService is set via DI in constructor
        TempData["message"] = "Person successfully updated.";
        TempData["messageType"] = "success"
        return RedirectToAction("Details", new { id = person.ObjectId });
    }
    catch (DomainException ex)
    {
        //For putting business logic errors in the ModelState
        ModelState.AddModelError(string.Empty, ex.Message);
        return RedirectToAction("Edit", new {id = model.ObjectId});
    }
}

_Layout.cshtml ファイルによって呼び出される部分ビューがあります。これは基本的に、フィードバック メッセージで満たされるプレースホルダー DIV 要素 (およびいくつかの js) であり、これは正常に機能します。

更新フィードバック

現在、これはデフォルトで機能しますが、TempData はセッションに依存しているため、可能であれば無効にし、TempDataProvider の別の実装を使用して、セッションがないことを回避したいと考えています。TempData の実装を変更せずにセッションを無効にすると、初めて使用しようとすると InvalidOperationException という状態になるため、別の TempDataProvier を使用する必要があります。

SessionStateTempDataProvider クラスでは、セッション状態を有効にする必要があります。

<system.web>
  <sessionState mode="Off"/>
</system.web>

Dependency Injector である StructureMap を使用して新しいコンポーネントを登録したところ、次のようになりました。

//I have tried this with and without the HttpContextScoped()
For<ITempDataProvider>().HttpContextScoped().Use<CookieTempDataProvider>();
For<HttpContextBase>().HttpContextScoped().Use(x => new HttpContextWrapper(HttpContext.Current));

CookieTempDataProvider の私の実装はここからのものであることに言及する必要があります どうやらそれは削除されました。

これで、TempData を使用しようとすると例外が解決されますが、フィードバックが表示されません。私は自分の努力で何かを壊したのではないかと思ったので、DI 行をコメントアウトし、セッション状態モードを に戻しInProc、テストしました。私のフィードバックは期待どおりに表示されます (IISExpress を再起動した後)。注入行のコメントを外し、セッション状態を に変更するOffと、フィードバックなしに戻ります。

さらにテストを行ったところ、アクションで次のことを行ってもメッセージが表示されないことがわかりました

TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return RedirectToAction("Details", new { id = person.ObjectId });

しかし、PRG パターンを無視してこれを行うと、フィードバックが表示されます。

TempData["message"] = "Person successfully updated.";
TempData["messageType"] = "success"
return View("Edit", person);

私の質問は、一般的に受け入れられている CookieTempDataProvider に欠陥があるのでしょうか、それとも何か間違っているのでしょうか?

4

0 に答える 0