2012-06-08 13 views
5

Da ich die gleichen Schlüssel für TempData immer und immer wieder verwende, möchte ich es einfacher machen, diese Schlüssel zu verfolgen. Es wäre toll, wenn ich schließlich so etwas schreiben könnte:TempData Wrapper

MyTempData.Message = "my message"; 

statt

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

Wie wäre es ViewBag statt ? –

Antwort

7

Klingt wie Sie eine stark typisierte TempData wollen. Eine Möglichkeit, darüber zu gehen, ist das Schreiben eine Erweiterungsmethode an Controller, es zu tun:

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

gibt einen Fehler aus: Der Name 'TempData' ist im aktuellen Kontext nicht vorhanden. – Dmitry

+0

In eine Methodenerweiterung für alle Controller aktualisiert. –

+0

dies funktioniert als Controller-Erweiterung (Ich habe einige Tippfehler in Ihrem Code bearbeitet). Es wäre schön, TempData irgendwie in der Eigenschaft einer statischen Klasse speichern zu können. Wenn Sie keine Möglichkeit sehen, das zu tun, werde ich mit Ihrem Vorschlag gehen. Lass es mich wissen, bitte. – Dmitry

0

Es ist schwer zu sagen, auf welcher Ebene Sie die temporären Daten möchten bestehen bleiben. Meine Interpretation ist, dass es so klingt, als ob Sie in der Lage wären, einen gemeinsamen Satz von Eigenschaften für alle Ihre ViewModels zur Verfügung zu haben.

Um dies zu erreichen, erben Sie von einer gemeinsamen ViewModel-Klasse.

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

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

Sollte sich herausstellen, dass Sie Daten aus, die in Session bestehen bleiben, dann ein Singleton implementieren, und denken Sie daran eine @using Aussage zu Ihrer Ansicht hinzuzufügen, es zu verweisen.

0

Sie könnten nachahmen, was ViewBag tut.

Zuerst wird eine interne versiegelte Klasse namens DynamicViewDataDictionary verwendet. Im Grunde werde ich nur eine Version davon für TempData erstellen. Dann können wir Erweiterungsmethoden verwenden, um es in Controller, WebViewPage zur Verfügung zu stellen, usw.

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

In Ihrem Controller:

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

In Ihrer Rasierer Ansicht:

@this.TempBag().SomeValue 

Wenn Sie denke nicht, dass die Erweiterungsmethode sauber genug ist, du könntest deine eigene Controller-Basisklasse erstellen, sowie deine eigenen Basisklassen für Rasiereransichten, die nette, prägnante Eigenschaften ala verwenden ViewBag.

4

Ziemlich Low-Tech-Option, aber wenn Sie nur die Schlüssel verfolgen möchten Sie verwenden, können Sie nur einige Konstanten erstellen:

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

dann:

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