Razor 视图引擎:表达式树不得包含动态操作。

187

我有一个类似于这样的模型:

public class SampleModel
{
     public Product Product { get; set; } 
}

在我的控制器中,当我尝试打印时出现异常

@Html.TextBoxFor(p => p.Product.Name)

以下是错误信息:

Exception: An expression tree may not contain a dynamic operation

如果有人能给我一些解决方法,那将不胜感激!


1
这个是基于MVC3 RC的吗?另外你能给我们展示一下产品长什么样子吗?我在MVC3 RC中无法复制它。 - bmancini
7个回答

324

在我看来,您使用了一个未经类型化的视图。在MVC3 RC中,默认情况下,Razor视图被视为 dynamic 类型。但是,lambda表达式不支持动态成员。您需要为模型强制指定类型。在您的视图文件顶部添加以下代码:

@model SampleModel

16
这是一个大写字母M让我做到了。 - whossname
如果你没有模型怎么办? - djack109
应该有一个选项可以点赞两次,至少在一年后。因为你的答案再次解决了我的问题。 - undefined

109
经常导致这种错误的原因是在添加

标签时出错。
@Model SampleModel

在页面顶部而不是

@model SampleModel

6
谢谢您添加这个答案!令人惊奇的是,即使经过多年的编程,你仍然可能会忘记大小写敏感性。 - brentlightsey
2
如果你使用"model"而不是"@Model",也可能发生这种情况... 这样会在运行时构建但失败。 - Dave Remy

10
在这个链接中讲解了@model,在这里摘录一段:

@model(小写的“m”)是Razor视图中的保留关键字,用于在视图顶部声明模型类型。您也可以加上命名空间,例如:@model MyNamespace.Models.MyModel

稍后在文件中,您可以使用@Model.Attribute(大写的“M”)引用要使用的属性。


2
这是我的问题。如果你不仔细观察,Visual Studio往往会将你输入的内容转换为大写的“M”。这真的很恼人。 - RobbieE

7

在使用 (将html helper强类型化到视图中) 这行代码之前

@Html.TextBoxFor(p => p.Product.Name)

为了使视图具有强类型,您应该将模型包含在页面中。

@model SampleModel

7

看起来你的视图类型是 dynamic。将视图设置为正确的类型,你就会发现错误消失了。


2

这个错误发生在我身上,因为我使用了@@model而不是@model... 在我的情况下是复制粘贴错误。将其更改为@model后问题得到解决。


0
在vb.net中,您必须编写@ModelType。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接