Est-il possible d'envelopper des méthodes Html.CheckboxFor, Html.TextboxFor, etc. avec une logique personnalisée?

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

Question

Je travaille avec des modèles hérités qui encapsulent les données et les métadonnées dans une propriété unique. Pour les besoins de cette question, supposons que l'interface soit:

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

Je veux envelopper la méthode d'extension CheckBoxFor () avec la mienne,

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

Y a-t-il un moyen de faire quelque chose comme ça? Où pourrais-je commencer?

Toute aide serait appréciée,

Merci,
Alex

Réponse populaire

Vous pouvez essayer quelque chose comme ça:

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

Vous pouvez également souhaiter mettre en cache l'expression compilée.

Mon exemple utilise Html.CheckBox (); Je ne sais pas trop comment utiliser CheckBoxFor (). Je n'ai pas le temps d'enquêter non plus, mais au moins c'est un début.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow