2013-04-19 8 views
6

Ich schreibe einen HTML-Helper für einen Editor. Die Idee besteht darin, Eigenschaften aus dem Model mit Attributen AutoGenerateField zu erhalten und eine Tabelle zu erstellen, wobei jede Zeile einen Namen eines Feldes (auch aus dem Attribut) und eine TextBox oder eine CheckBox enthält, die den tatsächlichen Wert des Feldes enthält.HTMLHelper, Generierung Parameter des Typs "Expression <Func <TModel, TValue >> Ausdruck" aus Eigenschaft

Ich habe ein Problem mit HTMLHelper. Da ich das ganze Modell auf die Helfer und nicht einen Wert senden, kann ich nicht Methoden wie TextBoxFor, da sie Parameter benötigen, wie

"Expression<Func<TModel, TValue>> expression". 

ich Reflexion bin mit und ich versuchte stattdessen die Eigenschaft zu schicken, Visual Studio betrachtet dies weiterhin als falsche Verwendung.

public static MvcHtmlString GenerateEditor<TModel>(this HtmlHelper<TModel> htmlHelper) 
{ 
    var model = htmlHelper.ViewData.Model; 
    var result = String.Empty; 

    //generating container, etc ... 

    foreach (var property in model.GetType().GetProperties()) 
    { 
     var attr = property.GetCustomAttributes(typeof (DisplayAttribute), true).FirstOrDefault(); 
     if (attr == null) continue; 
     var autoGenerate = ((DisplayAttribute)attr).AutoGenerateField; 
     if(autoGenerate) 
     { 
      //here I'm building the html string 
      //My problem is in the line below: 
      var r = htmlHelper.TextBoxFor(property); 
     } 
    } 
    return MvcHtmlString.Create(result); 
} 

Irgendwelche Ideen:

unten Methode für meine Htmlhelper vereinfacht?

Antwort

2

Wie wäre es nur mit den Nicht-Lambda-Überladungen. : InputExtensions.TextBox()

if(autoGenerate) 
{ 
    //here I'm building the html string 
    //My problem is in the line below: 
    var r = htmlHelper.TextBox(property.Name); 
} 
//not sure what you do with r from here... 

Wenn ich das name Attribut des Formular-Elements ist nicht alles täusche gesetzt sogar den Eigenschaftsnamen, wenn Sie die Lambda-Version der Funktion verwenden, so sollte dies das gleiche tun.

Ich werde versuchen zu überprüfen, was die Lambda-Funktion tut, können Sie das gleiche tun, da Sie die TModel mit Ihnen haben.


aktualisieren

Aus kurzen Blick der Dinge innerhalb des Quellcodes von InputExtensions.cs, TextBoxFor schließlich InputHelper() ruft ruft die ExpressionHelper.GetExpressionText(LambdaExpression expression) innerhalb ExpressionHelper.cs schließlich nennt, die von den flüchtigen Blicken der Dinge die member.Name bekommt für das Attribut html für das Eingabeelement.

Ich kann es nicht genau jetzt überprüfen, weil ich nicht auf Windows bin, aber ich denke, die Nicht-Lambda-Funktion sollte Ihrem Bedarf entsprechen. Sag mir wie es geht?

+0

Danke! Es hat erfolgreich funktioniert! – Anelook

+0

@Anelook du bist willkommen) – gideon

Verwandte Themen