12

不重复: MVC Razor 动态模型,“对象”不包含“属性名称”的定义

根据那里的答案,

根据 David Ebbo 的说法,您不能将匿名类型传递给动态类型视图,因为匿名类型被编译为内部类型。由于 CSHTML 视图被编译成一个单独的程序集,它不能访问匿名类型的属性。

为什么当部分视图位于“/Home/_Partial.cshtml”时,下面的代码 - 据称永远不会工作 - 像我预期的那样工作,但在移动到“/Shared/_Partial.cshtml”时突然停止工作?

使用 ASP.NET 4.5(和以前的版本),下面会生成文本“Hello, World!” 到网络浏览器:

~/Controllers/HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace TestDynamicModel.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

~/Views/Home/Index.cshtml

@Html.Partial("_Partial", new { Text = "Hello, world!", ShouldRender = true } )

~/Views/Home/_Partial.cshtml

@model dynamic
@if (!Model.ShouldRender)
{
    <p>Nothing to see here!</p>
}
else
{
    <p>@Model.Text</p>
}

但是,当 _Partial.cshtml 移动到 ~/Views/Shared/_Partial.cshtml 时,_Partial.cshtml 中会引发以下错误(第 2 行):

'object' does not contain a definition for 'ShouldRender'

在调试器中检查模型后,我发现以下属性:

Model { Text = Hello, world!, ShouldRender = True }
4

3 回答 3

1

虽然问题与 ASP.NET MVC 的行为有关,并且我知道解决方法,但我不确定每个人都是。对于只想让代码正常工作的任何人,这里有一个解决方法: Razor 中的动态匿名类型会导致 RuntimeBinderException

于 2013-09-24T16:21:54.393 回答
1

我找到了这个 SO 答案:https ://stackoverflow.com/a/21633464/605067是我的错误的解决方案,它的症状与你的相同。错误消息是:

'object' does not contain a definition for 'property'

并且以与您相​​同的方式将匿名对象传递给 {{@Html.Partial}} 导致。

如该答案所述,将匿名对象传递到部分视图中是完全有效的,并且这些视图不需要包含 {{@model dynamic}} - 实际上,如果您使用动态模型,则会产生一些不必要的开销。

真正的问题是,至少在我的情况下,此错误消息具有误导性。问题是我在同一目录中有其他未正确编译的视图文件,并且似乎关闭了视图编译器。另一个 SO 帖子中提供的修复工作有效,即设置 *.csproj 属性

<MvcBuildViews>true</MvcBuildViews>

为真,然后修复我认为的所有编译错误。修复它们之后,我能够在我的局部视图中绑定到匿名对象。

于 2014-03-27T21:25:17.200 回答
-5

要使用dynamic类型,您需要引用Microsoft.CSharp程序集。检查您的项目的参考资料。

于 2014-04-10T08:33:49.863 回答