MVC4 模板只能用于字段访问
Posted
技术标签:
【中文标题】MVC4 模板只能用于字段访问【英文标题】:MVC4 Templates can be used only with field access 【发布时间】:2014-01-03 23:19:42 【问题描述】:我有一个类似的 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
,但这只会发生在我所知道的值类型上,因为我已经用整数(可空和不可空)进行了测试,并且DateTime
对象。
似乎 lambda 表达式的 NodeType
是 Convert
,字符串是 Member access
。
我知道错误本身的原因,但我不知道是什么导致编译器将model=>model.Number
评估为model => Convert(model.Number)
。
谢谢!
【问题讨论】:
【参考方案1】:有一个转换可以将model.Number
从int
转换为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
【讨论】:
谢谢!我不敢相信我没有注意到这一点,这是一个愚蠢的错误,但我现在让它起作用了。以上是关于MVC4 模板只能用于字段访问的主要内容,如果未能解决你的问题,请参考以下文章