Gibt es eine Möglichkeit, die Methoden Html.CheckboxFor, Html.TextboxFor usw. mit benutzerdefinierter Logik zu umbrechen?

asp.net-mvc asp.net-mvc-3 expression-trees linq

Frage

Ich arbeite mit Legacy-Modellen, die Daten und Metadaten in einer einzigen Eigenschaft zusammenfassen. Für diese Frage nehmen wir an, die Schnittstelle ist:

pubic interface ILegacyCheckbox 
{
   bool Value { get; set; }
   bool Editable { get; set; }
}

Ich möchte die CheckBoxFor () - Erweiterungsmethode mit meiner eigenen,

public static MvcHtmlString LegacyCheckboxFor<TModel>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, ILegacyCheckbox>> expression)
{
    // wrap html.CheckBoxFor() method here by extracting the Value  
    // property and check if Editable is false, in which case add 
    // an htmlAttribute of "disabled=true"
}

Gibt es eine Möglichkeit, so etwas zu tun? Wo würde ich anfangen?

Jede Hilfe wäre willkommen,

Vielen Dank,
Alex

Beliebte Antwort

Du könntest so etwas versuchen:

public static MvcHtmlString LegacyCheckboxFor<TModel>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, ILegacyCheckbox>> expression)
{
    var parameterName = ((MemberExpression)expression.Body).Member.Name;
    var compiled = expression.Compile().Invoke(html.ViewData.Model);

    if (editable)
        return html.CheckBox(parameterName, compiled.Value);
    else
        return html.CheckBox(parameterName, compiled.Value, new {disabled = "disabled"});
}

Sie können den kompilierten Ausdruck auch zwischenspeichern.

Mein Beispiel verwendet Html.CheckBox (); Ich bin nicht sicher, wie man CheckBoxFor () benutzt. Ich habe auch keine Zeit, es zu untersuchen, aber zumindest ist das ein Anfang.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum