因爲我一次又一次地對TempData使用相同的鍵,所以我想讓它更容易跟蹤這些鍵。 這將是巨大的,如果最終我能寫出像這樣的:TempData Wrapper
MyTempData.Message = "my message";
代替
TempData["Message"] = "my message";
因爲我一次又一次地對TempData使用相同的鍵,所以我想讓它更容易跟蹤這些鍵。 這將是巨大的,如果最終我能寫出像這樣的:TempData Wrapper
MyTempData.Message = "my message";
代替
TempData["Message"] = "my message";
聽起來像是你想有一個強類型的TempData。去了解一種方法是在控制器寫一個擴展方法來做到這一點:
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;
}
}
這很難告訴你想要什麼級別的臨時數據持續。 我的解釋是,這聽起來像你希望能夠在所有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";
在您的Razor視圖:
@this.TempBag().SomeValue
如果您不要認爲擴展方法足夠乾淨,您可以創建自己的Controller基類,以及您自己的基類,用於使用漂亮,簡潔的屬性ala的剃鬚刀視圖ViewBag
。
漂亮的低技術含量的選擇,但如果你只是想跟蹤您正在使用的鍵,你可以只創建一些常量:
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";
如何ViewBag代替? –