Quel est le moyen le plus simple d’obtenir la valeur de propriété d’une expression lambda transmise dans une méthode d’extension pour HtmlHelper?

J’écris une sale petite méthode d’extension pour HtmlHelper afin que je puisse dire quelque chose comme HtmlHelper.WysiwygFor (lambda) et afficher le CKEditor.

J’ai ce travail actuellement, mais cela me semble un peu plus lourd que je ne le souhaiterais. J’espère qu’il y a une façon plus simple de le faire.

Voici ce que j’ai jusqu’ici.

public static MvcHtmlSsortingng WysiwygFor(this HtmlHelper helper, Expression<Func> expression) { return MvcHtmlSsortingng.Create(ssortingng.Concat("")); } private static ssortingng GetValue(HtmlHelper helper, Expression<Func> expression) { MemberExpression body = (MemberExpression)expression.Body; ssortingng propertyName = body.Member.Name; TModel model = helper.ViewData.Model; ssortingng value = typeof(TModel).GetProperty(propertyName).GetValue(model, null).ToSsortingng(); return value; } private static ssortingng MemberName(this Expression<Func> expression) { var memberExpression = expression.Body as MemberExpression; if (memberExpression == null) throw new InvalidOperationException("Expression must be a member expression"); return memberExpression.Member.Name; } 

Merci!

Essayez comme ceci:

 public static MvcHtmlSsortingng Try( this HtmlHelper htmlHelper, Expression> expression ) { var builder = new TagBuilder("textarea"); builder.AddCssClass("ckeditor"); builder.MergeAtsortingbute("cols", "80"); builder.MergeAtsortingbute("name", "editor1"); builder.MergeAtsortingbute("id", expression.Name); // not sure about the id - verify var value = ModelMetadata.FromLambdaExpression( expression, htmlHelper.ViewData ).Model; builder.SetInnerText(value.ToSsortingng()); return MvcHtmlSsortingng.Create(builder.ToSsortingng()); } 
 ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); Object value = metadata.Model; Ssortingng name = metadata.PropertyName; 

Je sais que c’est un vieux thread mais juste au cas où quelqu’un le chercherait, le moyen de générer un atsortingbut id / name est aussi:

 System.Web.Mvc.ExpressionHelper.GetExpressionText(expression); 

J’utilise ceci dans mes extensions et je n’ai jamais eu aucun problème avec elle. Cela fonctionne également très bien avec les propriétés nestedes.

Le moyen le plus simple consiste à envelopper le tout dans une méthode d’extension:

 public static class ExtensionMethods { public static object Value(this Expression> expression, ViewDataDictionary viewData) { return ModelMetadata.FromLambdaExpression(expression, viewData).Model; } } 

La syntaxe d’appel est donc la suivante:

 expression.Value(htmlHelper.ViewData) 

ASP.NET MVC 3 Futures inclut une aide pour cela.

Ce n’est pas la réponse de Peter ou de BigMomma, mais elle combine les deux. Si vous appelez cela depuis une méthode de contrôleur, où vous n’avez pas access à une instance de HtmlHelper, créez simplement une méthode de contrôleur de base comme celle-ci:

 public ModelMetadata GetModelMetadata( TModel model, Expression> expression ) { ViewData.Model = model; //model is null in Controller; you must set it here (or earlier) in order to extract values from the returned ModelMetadata. return ModelMetadata.FromLambdaExpression( expression, new ViewDataDictionary( ViewData ) ); } 

Ensuite, vous pouvez lire ce dont vous avez besoin à partir des métadonnées du modèle, comme d’habitude;

 var mm = GetModelMetaData( model, m => m.SomeProperty ); ssortingng name = mm.PropertyName; object value = mm.Model;