asp.net-mvc - 带参数编译的 Lambda 表达式

标签 asp.net-mvc lambda extension-methods func

我想用助手来扩展 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/

相关文章:

c# - 通用 orderby 子句的动态表达式

c++ - Lambda 函数作为基类

c# - 类属性——属性为空时通过扩展方法填充

javascript - Html.DropDownListFor 和 JavaScript 数组

c# - 传入字典的模型项是 'Umbraco.Web.Models.RenderModel' 类型的,但是这个字典需要一个 'TestModel' 类型的模型项

python - 使用python写入AWS Lambda中的/tmp目录

c# - 如何部分指定泛型方法类型参数

c# - 是否可以将类中的扩展方法限制为特定类型?

asp.net-mvc - MVC Razor 表单提交不工作

c# - AppSettings 按值查找键