MVC4模板只能用于字段访问

时间:2013-12-16 14:18:58

标签: c# asp.net-mvc asp.net-mvc-4 razor lambda

我有一个与此类似的MVC模型

public class Model
{
     public string Name {get;set;}
     public int Number {get;set;}
}

我收到错误

  

模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。

尝试为数字字段创建标签时,模型lambda表达式存储在变量中。

例如,在我看来,我有:

@Html.LabelFor(model => model.Name) // Works fine
@Html.LabelFor(model => model.Number) // Works fine

@{
    Expression<Func<Offer, object>> nameExpression = model => model.Name;
    Expression<Func<Offer, object>> numberExpression = model => model.Number;
}
@Html.LabelFor(nameExpression) // Works fine
@Html.LabelFor(numberExpression) // Error!

我注意到使用调试器,lambda表达式是model => Convert(model.Number)而不是model => model.Number,但这只发生在我可以告诉的值类型中,因为我已经用整数测试(可空和非-nullable)和DateTime个对象。 lambda表达式的NodeType似乎是Convert,因为字符串是Member access

我知道错误本身的原因,但我不知道是什么原因导致编译器将model=>model.Number评估为model => Convert(model.Number)

谢谢!

1 个答案:

答案 0 :(得分:3)

有一个转换可以将model.Numberint转换为object。您可以通过使用调试器

查看表达式来检查它
.Lambda #Lambda1<System.Func`2[Model,System.Object]>(Model $model) {
    (System.Object)$model.Number
}

如果您想获得正确的表达方式,则必须使用Expression<Func<Model, int>>

Expression<Func<Model, int>> numberExpression = model => model.Number;

此表达式已翻译为

.Lambda #Lambda1<System.Func`2[Model,System.Int32]>(Model $model) {
    $model.Number
}