5

TempData に同じキーを何度も使用するため、これらのキーを追跡しやすくしたいと考えています。最終的に次のように書くことができれば素晴らしいことです。

MyTempData.Message = "my message";

それ以外の

TempData["Message"] = "my message";
4

4 に答える 4

8

厳密に型指定された TempData が必要なようです。それを行う 1 つの方法は、それを行うために Controller に拡張メソッドを記述することです。

public static class ControllerExtensions
{
  public string GetMessage(this Controller instance)
  {
    string result = instance.TempData["Message"] as string;
    if (result == null)
    {
      result = "some default value or throw null argument exception";  
    }
    return result;
  }

  public void SetMessage(this Controller instance, string value)
  {
    instance.TempData["Message"] = value;
  }
}
于 2012-06-08T21:48:32.583 に答える
5

かなりローテクなオプションですが、使用しているキーを追跡したいだけなら、いくつかの定数を作成できます:

public static class TempDataKeys
{
    public const string Message = "Message";
    public const string Warning = "Warning";
    public const string Error = "Error";
    // etc
}

それから:

TempData[TempDataKeys.Message] = "Some message";
于 2012-06-09T07:53:08.033 に答える
0

一時データを永続化するレベルを判断するのは困難です。私の解釈では、すべての ViewModel で使用できる共有プロパティ セットを使用できるようにしたいと考えているようです。

これを実現するには、共通の ViewModel クラスから継承します。

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

public class MyModel : BaseViewModel
{
   public string MyUniquePropety{get;set;}
}

セッションでデータを保持したいことが判明した場合は、シングルトンを実装し、それを参照する @using ステートメントをビューに追加することを忘れないでください。

于 2012-06-09T06:12:09.767 に答える
0

あなたは何をするかを模倣することができViewBagます。

まず、 と呼ばれる内部シール クラスを使用しDynamicViewDataDictionaryます。基本的には、TempData 用のバージョンを作成するだけです。次に、拡張メソッドを使用してControllerWebViewPage、 などで使用できるようにします。

public sealed class DynamicTempDataDictionary : DynamicObject
{
    private readonly Func<TempDataDictionary> _tempDataThunk;

    public DynamicTempDataDictionary(Func<TempDataDictionary> viewDataThunk)
    {
        _tempDataThunk = viewDataThunk;
    }

    private TempDataDictionary ViewData
    {
        get { return _tempDataThunk(); }
    }

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return ViewData.Keys;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = ViewData[binder.Name];
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        ViewData[binder.Name] = value;
        return true;
    }
}

public static class TempBagExtensions
{
    private const string TempBagKey = "__CurrentTempBagDictionary";

    public static dynamic TempBag(this ControllerBase controller)
    {
        return GetCurrentDictionary(controller.ControllerContext);
    }

    public static dynamic TempBag(this WebViewPage viewPage)
    {
        return GetCurrentDictionary(viewPage.ViewContext.Controller.ControllerContext);
    }


    private static DynamicTempDataDictionary GetCurrentDictionary(ControllerContext context)
    {
        var dictionary = context.HttpContext.Items[TempBagKey] as DynamicTempDataDictionary;

        if (dictionary == null)
        {
            dictionary = new DynamicTempDataDictionary(() => context.Controller.TempData);
            context.HttpContext.Items[TempBagKey] = dictionary;
        }

        return dictionary;
    }
}

コントローラーで:

this.TempBag().SomeValue = "Test";

あなたのかみそりビューで:

@this.TempBag().SomeValue

拡張メソッドが十分にクリーンでないと思われる場合は、独自のコントローラー基本クラスと、適切で簡潔なプロパティ ala を使用する razor ビュー用の独自の基本クラスを作成できますViewBag

于 2012-06-09T07:00:40.880 に答える