我想用助手来扩展 MVC。假设我想构建一个扩展方法,该方法从模型中获取属性并呈现一个段落。
我已经编写了这段代码,但它无法编译。我不知道该怎么做:
public static class PExtension
{
public static string PFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) where TModel: class
{
var f = expression.Compile();
// won't compile the line below:
string propretyValue = f();
return "<p>" + propretyValue + "</p>";
}
}
郑重声明,我的观点应该使用如下内容:
@Html.PFor(m => m.Description);
谢谢。
编辑
错误描述:*委托(delegate)“Func”不接受 0 个参数*
最佳答案
表达式参数指定表达式的返回值为 TValue,但您试图将已编译表达式的返回值分配给字符串。我猜编译错误是关于“无法将 TValue 转换为字符串”?
试试这个:
object propertyValue = f();
return string.Format( "<p>{0}</p>", propertyValue != null ? propertyValue.ToString() : string.Empty );
更新:
您发布的错误表明您需要将模型对象传递给表达式才能对其进行评估。在查看 ASP.NET MVC source code对于他们如何执行扩展方法,他们从 ViewData 获取模型,如下所示:
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
所以试试这个:
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
object propertyValue = f((TModel)metadata.Model);
return string.Format( "<p>{0}</p>", propertyValue != null ? propertyValue.ToString() : string.Empty );
关于asp.net-mvc - 带参数编译的 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16018027/