2

我想用助手扩展 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' does not take 0 arguments*

4

2 回答 2

1

最后,代码如下所示:

 public static class PExtension
    {
        public static MvcHtmlString PFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) where TModel : class
        {
            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);

            return MvcHtmlString.Create(string.Format("<p>{0}</p>", metadata.Model != null ? metadata.Model.ToString() : string.Empty));
        }
    }
于 2013-04-15T16:23:22.877 回答
1

表达式参数指定表达式的返回值为 TValue,但您试图将编译后的表达式的返回值分配给字符串。我猜编译错误是关于“无法将 TValue 转换为字符串”的?

试试这个:

object propertyValue = f();
return string.Format( "<p>{0}</p>", propertyValue != null ? propertyValue.ToString() : string.Empty );

更新:

您发布的错误表明您需要将模型对象传递给表达式才能对其进行评估。在查看ASP.NET MVC 源代码以了解他们如何执行扩展方法时,他们从 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 );
于 2013-04-15T15:34:01.320 回答