2010-11-24 4 views
7

Meine Ansicht erbt Models.MyModelGet Modell in Verbindung mit entsprechenden Ansicht in Htmlhelper

<%@ Page Language="C#" MasterPageFile="Something.Master" Inherits="Models.MyModel>" %> 

Ich brauche eine Eigenschaft Model.Something in einem HtmlHelper Verfahren verfügbar zu sein, wenn ich es aus dieser Sicht aufrufen.

<%= Html.CustomHelper(...) %> 

Gibt es eine Möglichkeit, darauf zuzugreifen? Vielleicht über ViewContext oder ViewDataDictionary?

Ich möchte nicht explizit Model.SessionKey für jeden Helfer übergeben, den ich anrufe. Gibt es einen Ansatz, den ich verpasst habe? Oder ist das unmöglich?

Danke.

Antwort

23

Mein Ansatz dazu wäre, dass alle Modelle, die Sie mit diesem Helper verwenden möchten, eine Schnittstelle implementieren, die ihre gemeinsamen Eigenschaften definiert. Die ViewData-Eigenschaft des HtmlHelper-Objekts besitzt eine Model-Eigenschaft (vom Typ object). In Ihrem Helfer können Sie dies als Schnittstellentyp einstufen. Unter der Annahme, dass es an diesem Punkt nicht Null ist, d. H. Tatsächlich nicht null und vom richtigen Typ, können Sie dann die allgemeinen Eigenschaften verwenden.

public static string CustomerHelper(this HtmlHelper helper, ...) 
{ 
    var model = helper.ViewData.Model as ISessionModel; 

    var sessionKey = model.SessionKey; 

    ... 
} 
+0

@Timothy: Thankyou. Probieren Sie es sofort! –

4

Ebenso können Sie dies tun:

public static string CustomerHelper(this HtmlHelper helper, ...) 
{ 
    ISessionModel model = helper.ViewData.Model; 

    var sessionKey = model.SessionKey; 

    ... 
} 

Der einzige Unterschied ist, dass Sie müssen nicht eine Besetzung tun ....

+0

Sicherlich kompiliert das nicht, Sie * implizit * Casting 'Objekt' zu' ISessionModel'? –