2013-10-03 3 views
2

J'ai une extension HtmlHelper personnalisée, ce qui rend les contrôles basés sur teh paramètres d'entrée d'aide.Expression <Func <TModel, TValue >> à l'expression <Func <TModel, bool >>

Je suis dans une situation, où, je suis capable de rendre n'importe quel contrôle, sauf un CheckBox. Comme l'aide de CheckBoxFor accepte,

J'ai besoin d'un moyen de convertir le type de retour du Func en bool, comme mentionné dans le titre.

Répondre

5

Vous pouvez traduire le lambda:

public static class HtmlExtensions 
{ 
    public static IHtmlString MyHelper<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     if (typeof(TProperty) != typeof(bool)) 
     { 
      throw new InvalidOperationException("You can only generate checkboxes with boolean properties on your view model"); 
     } 

     var boolExpression = Expression.Lambda<Func<TModel, bool>>(ex.Body, ex.Parameters); 

     return html.CheckBoxFor(boolExpression); 
    } 
} 

Maintenant, vous pouvez utiliser l'assistant sur les propriétés booléennes sur votre modèle:

@Html.MyHelper(x => x.SomeBooleanProperty) 
+0

Quand j'ai une propriété imbriqué comme 'Foo.Bar [0] .Stick [0] .Checked', puis le html généré, l'attribut name doit être comme name = 'Foo.Bar [0] .Stick [0] .Checked' comme fait le CheckBoxFor intégré. Votre solution génère l'attribut name sous le nom name = 'Checked'. :-( – Nauman

+0

Ah, mon mauvais, j'ai utilisé 'Foo.Bar.First(). Stick.First(). Checked', au lieu de' Foo.Bar [0] .Stick [0] .Checked'. Merci!: -) – Nauman

Questions connexes