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 =&gt; Convert(model.Number),而不是 model =&gt; model.Number,但这只会发生在我所知道的值类型上,因为我已经用整数(可空和不可空)进行了测试,并且DateTime 对象。 似乎 lambda 表达式的 NodeTypeConvert,字符串是 Member access

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

谢谢!

【问题讨论】:

【参考方案1】:

有一个转换可以将model.Numberint 转换为object。您可以通过使用调试器查看表达式来检查

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

如果你想得到正确的表达,你必须使用Expression&lt;Func&lt;Model, int&gt;&gt;

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

这个表达式被翻译成

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

【讨论】:

谢谢!我不敢相信我没有注意到这一点,这是一个愚蠢的错误,但我现在让它起作用了。

以上是关于MVC4 模板只能用于字段访问的主要内容,如果未能解决你的问题,请参考以下文章

TSLint - 您只能绑定到公共类成员(模板使用公共)

访问对象内的字段时,速度模板不会去模板化

如何从车把模板访问主干模型的计算字段?

如何从车把模板访问主干模型的计算字段?

将关键字段访问到 Django 模板中

访问解析器映射模板中的请求字段