2012-06-08 79 views
5

因爲我一次又一次地對TempData使用相同的鍵,所以我想讓它更容易跟蹤這些鍵。 這將是巨大的,如果最終我能寫出像這樣的:TempData Wrapper

MyTempData.Message = "my message"; 

代替

TempData["Message"] = "my message"; 
+0

如何ViewBag代替? –

回答

7

聽起來像是你想有一個強類型的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; 
    } 
} 
+0

引發錯誤:名稱'TempData'在當前上下文中不存在。 – Dmitry

+0

已更新爲所有控制器的方法擴展。 –

+0

這是一個控制器擴展(我在你的代碼中編輯了一些拼寫錯誤)。能夠以某種方式將TempData存儲在靜態類的屬性中將會很好。如果你沒有看到任何方法,我會跟你的建議。請告訴我。 – Dmitry

0

這很難告訴你想要什麼級別的臨時數據持續。 我的解釋是,這聽起來像你希望能夠在所有ViewModel上具有共享的一組屬性。

要完成此操作,請從普通的ViewModel類繼承。

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

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

如果事實證明你希望數據會話持久化,然後實現一個單身,記得一個@using語句添加到您的視圖來引用它。

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"; 

在您的Razor視圖:

@this.TempBag().SomeValue 

如果您不要認爲擴展方法足夠乾淨,您可以創建自己的Controller基類,以及您自己的基類,用於使用漂亮,簡潔的屬性ala的剃鬚刀視圖ViewBag

4

漂亮的低技術含量的選擇,但如果你只是想跟蹤您正在使用的鍵,你可以只創建一些常量:

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";