2012-10-06 13 views
13

Ich versuche, einen HtmlHelper zu erstellen, der Bootstrap-kompatible Formularfelder erstellt. Mein erstes Ziel war es, ein Htmlhelper zu schaffen, die die umgebende div schaffen:Abrufen des vollständigen Eigenschaftsnamens mit ModelMetadata

<div class="control-group"> ... </div> 

Nach der hervorragenden Beratung hier und auch hier habe ich es geschafft, um es relativ schnell zu arbeiten. Aber es funktioniert nicht immer.

Ich habe ein ViewModel mit einer komplexen Eigenschaft, so in meinem Formular Zugriff auf das Feld m=>m.Complex.Element. In meinem Helfer überprüfe ich das Element auf Validierungsfehler. Ich benutze ModelMetadata.FromLambdaExpression(expression, html.ViewData). Die Metadaten, die ich zurückerhalte, haben den Eigenschaftsnamen Element und nicht Complex.Element.

Wenn ich den ModelState für diese Eigenschaft überprüfen, kann ich es nicht finden, weil der ModelState den vollständigen Namen behält - Complex.Element.

Ich kann nach Teiltreffern suchen, in der Hoffnung, dass es kein anderes Element gibt, aber das scheint ein böser Bug zu sein, der darauf wartet, passiert zu sein. Wie kann ich den vollständigen Eigenschaftsnamen aus dem Ausdruck erhalten?

Antwort

27

Es ist eine gute Sache, dass die MVC Quellen offen sind. Der richtige Weg, um die Modeleigenschaftsnamen zu erhalten, ist von

mit
var propertyName = ExpressionHelper.GetExpressionText(expression); 
+1

+1. Ich hatte auch dasselbe Problem. Deine Antwort hat mir geholfen :) –

6

Ich habe Folgendes verwendet, um es für das aktuelle Modell zu erhalten, müssen Sie den Eigenschaftsnamen anhängen, um es für die Eigenschaft zu erhalten.

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; 

Ansonsten herausziehen Reflektor/ilspy/was auch immer und überprüfen, was Ihre EditorFor/TextBoxFor oder welche Methode rendert Editor tut.

+0

Ich bekomme ein leeres Präfix. Ich werde in die MVC 3-Quellen schauen und sehen, wie Microsoft dies löst. Ich hoffte, dass jemand anderes es wusste und mir die Zeit sparen konnte. – zmbq

+0

Ich benutze dies (ohne "ViewContext.") Innerhalb meiner HtmlHelper-Extensions und meiner Editor/Display-Templates. Funktioniert soweit – Ingo

+1

Wenn Sie Ihre eigene HTML-Hilfsprogrammerweiterung schreiben, können Sie sie von dort bekommen 'htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix' – Odys

4

ich eine Kombination aus beiden Antworten für ein Attribut verwendet habe, die ich brauchte. Zusammen bieten beide Antworten ein Arbeitsattribut, das ich sowohl in Ansichten als auch in verschachtelten Editorschablonen verwenden kann. Hier ist mein Beispiel:

public static MvcHtmlString HasErrorClassFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression) 
{ 
    string expressionText = ExpressionHelper.GetExpressionText(expression); 

    string htmlFieldPrefix = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix; 

    string fullyQualifiedName; 

    if (htmlFieldPrefix.Length > 0) 
    { 
     fullyQualifiedName = string.Join(".", htmlFieldPrefix, expressionText); 
    } 
    else 
    { 
     fullyQualifiedName = expressionText; 
    } 

    bool isValid = htmlHelper.ViewData.ModelState.IsValidField(fullyQualifiedName); 

    if (!isValid) 
    { 
     return MvcHtmlString.Create("has-error"); 
    } 

    return MvcHtmlString.Empty; 
} 
Verwandte Themen