3

ASP.NET MVC Web アプリケーションには、かなり単純な (説明するための) 要件があります。

任意のページで、前のページで発生したイベントに基づいてメッセージを表示できます。メッセージには、ユーザーがフォーム送信で入力した情報などの動的コンテンツが含まれる場合があります。

これに似た...

はい、成功!

このアプローチは、POST-REDIRECT-GETシナリオで機能する必要があります。

ユーザーがアプリケーションで 2 つのブラウザー タブ (セッション状態を共有する) を開いている場合、メッセージは関連するイベントが発生したタブにのみ表示されます。

例えば:

  • フィードバック フォームを送信した後、ユーザーに感謝するメッセージ (名前)

  • ログイン時に、アプリケーションに最後にログインした日時をユーザーに通知するメッセージ

string私が最初に考えたのは、これに適切なモデル (プロパティを持つ) を持つ厳密に型指定されたビューを使用することでした。ただし、これは、既存の厳密に型指定されていないビューをすべてこのモデルを使用するように変更し、既存のすべてのモデルをこの新しいモデルから継承するように更新することを意味します。

これはやり過ぎのようです。

TempData別の方法は、メッセージを次の場所に保存することです。

// In my controller
TempData["Message"] = "Some kind of message";

// In my shared master view
@if (TempData["Message"] != null)
{
    <div class="message">@TempData["Message"]</div>
}

使用方法については、このブログ投稿TempDataでもう少し詳しく説明しています。興味深いことに、作成者は、代わりにカスタム HTTP ヘッダーを使用することも提案しています。興味深いアイデアですが、 POST-REDIRECT-GET では機能しません

優先オプションを使用しTempDataていますか、それとも「より良い」代替手段がありますか? (例えば、より強く型付けされたもの)

4

3 に答える 3

1

ViewModelsの間の通信にはを使用するのがベスト プラクティスです。以下のように、ベースとその他すべてを持つことができます。ViewControllersView ModelView Models derived from that

   public class BaseVM
    {
       public string Message{ get; set;}
    }

    public class CreateViewModel: BaseVM
    {
       public string CustoomerName{ get; set;}
    }

Message以下のように、モデルをコントローラーに返すときにプロパティを設定できます。

public ActionResult Step2()
{
   //Some Logic

    step2Model.Message = "Yes, Success..!!";

    return View(step2Model);
}

その後、各ビュー ページで、そのプロパティに何かが含まれているかどうかを確認できます。次のように実行できます。

 @if(!string.IsNullOrEmpty(Model.Message))
{
  //Show message
}

編集:

OPはこのアプローチをよく知っていますが、コードでこれを行う方法を示すスニペットがあるため、この回答を維持しています。第二に、ViewModels の使用に関しては、CodeCaster の回答の次のコメントに同意します。

これは、余分な作業が発生する可能性がありますが、これを実行するための唯一の一貫した、再利用可能でテスト可能なソリューションです。

于 2013-06-11T14:22:05.930 に答える
0

プロジェクトで、表示するメッセージが常にViewBag.InfoMessage動的変数に入るという規則を作成できます。したがって、コントローラからビューに渡された場合、レイアウト ファイルに表示されます。

より厳密な方法は、InfoMessageプロパティを持つ基本モデル クラスを作成し、その基本から他のすべてのモデル/ビューモデルを派生させることです。

POST-REDIRECT-GET シナリオでメッセージを永続化するには、値がビューに送信されたらクリアするセッション変数を使用して、複数のページに表示されないようにします。

ここにいくつかのコード:

public class BaseViewModel
{
    public string InfoMessage { get; set; }
}
public class SpecificViewModel : BaseViewModel
{
    // other model properties
}

コントローラーで次のようにします。

SpecificViewModel vm = new SpecificViewModel();

vm.InfoMessage = Session["InfoMessage"] as string;
Session["InfoMessage"] = null;

// other code

return View(vm);

もちろん、ビューには強く型付けされたモデルがあります: SpecificViewModel.

于 2013-06-11T14:15:48.463 に答える