TempData に同じキーを何度も使用するため、これらのキーを追跡しやすくしたいと考えています。最終的に次のように書くことができれば素晴らしいことです。
MyTempData.Message = "my message";
それ以外の
TempData["Message"] = "my message";
TempData に同じキーを何度も使用するため、これらのキーを追跡しやすくしたいと考えています。最終的に次のように書くことができれば素晴らしいことです。
MyTempData.Message = "my message";
それ以外の
TempData["Message"] = "my message";
厳密に型指定された 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;
}
}
かなりローテクなオプションですが、使用しているキーを追跡したいだけなら、いくつかの定数を作成できます:
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";
一時データを永続化するレベルを判断するのは困難です。私の解釈では、すべての ViewModel で使用できる共有プロパティ セットを使用できるようにしたいと考えているようです。
これを実現するには、共通の ViewModel クラスから継承します。
public class BaseViewModel
{
public string Message{get;set;}
}
public class MyModel : BaseViewModel
{
public string MyUniquePropety{get;set;}
}
セッションでデータを保持したいことが判明した場合は、シングルトンを実装し、それを参照する @using ステートメントをビューに追加することを忘れないでください。
あなたは何をするかを模倣することができViewBag
ます。
まず、 と呼ばれる内部シール クラスを使用しDynamicViewDataDictionary
ます。基本的には、TempData 用のバージョンを作成するだけです。次に、拡張メソッドを使用してController
、WebViewPage
、 などで使用できるようにします。
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
。