2012-06-08 11 views
5

Perché io uso stessi tasti per TempData più e più volte, vorrei rendere più facile per tenere traccia di queste chiavi. Sarebbe bello se alla fine avrei potuto scrivere qualcosa di simile:TempData Wrapper

MyTempData.Message = "my message"; 

invece di

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

ne dite invece ViewBag ? –

risposta

7

Suona come si desidera una TempData fortemente tipizzato. Un modo per andare a questo proposito che sta scrivendo un Metodo di estensione sul controller per farlo:

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

genera un errore: il nome "TempData" non esiste nel contesto corrente. – Dmitry

+0

Aggiornato su un'estensione di metodo per tutti i controller. –

+0

funziona come un'estensione controller (ho modificato alcuni refusi nel codice). Sarebbe bello poter archiviare TempData in qualche modo nella proprietà di una classe statica. Se non vedi alcun modo di farlo, andrò con il tuo suggerimento. Per favore mi faccia sapere. – Dmitry

0

E 'difficile dire a quale livello si desidera i dati temporanei a persistere. La mia interpretazione è che suona come vuoi essere in grado di avere un insieme condiviso di proprietà disponibili su tutti i tuoi ViewModel.

per raggiungere questo obiettivo, ereditano da una classe ViewModel comune.

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

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

Se si scopre che si desidera i dati a persistere in sessione, quindi implementare un Singleton, e ricordarsi di aggiungere una dichiarazione di @using per ingrandire l'immagine per fare riferimento a esso.

0

Si potrebbe imitare quello ViewBag fa.

primo luogo, esso utilizza una classe chiusa interno chiamato DynamicViewDataDictionary. Fondamentalmente, ho intenzione di crearne una versione per TempData. Poi, possiamo usare metodi di estensione per renderlo disponibile in Controller, WebViewPage, ecc

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

nel controller:

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

Secondo lei rasoio:

@this.TempBag().SomeValue 

Se non pensate che il metodo di estensione sia abbastanza pulito, potreste creare la vostra classe di base Controller, così come le vostre classi di base per le visualizzazioni del rasoio che usano proprietà piacevoli e concise ViewBag.

4

Piuttosto opzione low-tech, ma se si desidera solo per monitorare i tasti che si sta utilizzando, si può solo creare alcune costanti:

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

poi:

TempData[TempDataKeys.Message] = "Some message";