【发布时间】:2011-02-20 06:22:56
【问题描述】:
我正在为 HtmlHelper 编写一个肮脏的小扩展方法,以便我可以说类似 HtmlHelper.WysiwygFor(lambda) 并显示 CKEditor。
我目前有这个工作,但它似乎比我希望的要麻烦一些。我希望有更直接的方法来做到这一点。
这是我目前所拥有的。
public static MvcHtmlString WysiwygFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
return MvcHtmlString.Create(string.Concat("<textarea class=\"ckeditor\" cols=\"80\" id=\"",
expression.MemberName(), "\" name=\"editor1\" rows=\"10\">",
GetValue(helper, expression),
"</textarea>"));
}
private static string GetValue<TModel, TProperty>(HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
string propertyName = body.Member.Name;
TModel model = helper.ViewData.Model;
string value = typeof(TModel).GetProperty(propertyName).GetValue(model, null).ToString();
return value;
}
private static string MemberName<T, V>(this Expression<Func<T, V>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
throw new InvalidOperationException("Expression must be a member expression");
return memberExpression.Member.Name;
}
谢谢!
【问题讨论】:
-
我测试了你的 Getvalue 方法,当助手是一个选择列表时得到了很好的结果。在这种情况下,这里的其他方法都失败了。
标签: asp.net-mvc recursion lambda extension-methods html-helper