Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC剃须刀动态模型&x27;对象';不包含对';PropertyName';_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 3 MVC剃须刀动态模型&x27;对象';不包含对';PropertyName';

Asp.net mvc 3 MVC剃须刀动态模型&x27;对象';不包含对';PropertyName';,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,使用MVC3和Razor视图引擎。 我有这样的看法: @model dynamic @{ var products = (List<ListItemBaseModel>)Model.Products; var threshold = (int)(Model.Threshold ?? 1); var id = Guid.NewGuid().ToString(); } 在这两个视图中,当我调试它们并观察模型时,它似乎包含了正确的对象。 当我执行代码时,我在“va

使用MVC3和Razor视图引擎。 我有这样的看法:

@model dynamic
@{
    var products = (List<ListItemBaseModel>)Model.Products;
    var threshold = (int)(Model.Threshold ?? 1);
    var id = Guid.NewGuid().ToString();
}
在这两个视图中,当我调试它们并观察模型时,它似乎包含了正确的对象。 当我执行代码时,我在“var products=”行上得到一个错误,上面说:

“对象”不包含“产品”的定义

有人能解释一下我为什么会犯那个错误吗?
同样,当我在调试模式下观察模型对象时,它看起来很正常(有两个属性:Products和Threshold)

是否将匿名类的实例作为视图模型传递?我刚刚尝试了这个(CSHTML中的动态视图模型),在使用匿名类时得到了与您相同的错误,但是如果我创建了一个命名类,它工作得很好。我搜索过了,但没有在任何地方看到这个文档

// error
return View(new { Foo = 1, Bar = "test" });

// worked
return View(new TestClass { Foo = 1, Bar = "test" });
编辑#1:

根据,无法将匿名类型传递到动态类型视图中,因为匿名类型编译为
内部
。由于CSHTML视图被编译成单独的程序集,因此它无法访问匿名类型的属性

编辑#2:

David Ebbo编辑了自己的帖子,澄清如下:

注意(12/22/2011):现在MVC3已经直接支持动态,下面的技术不再是必要的。这篇文章实际上是将该特性集成到MVC中的原因


在.NET4.0上,匿名类型可以很容易地转换为ExpandoObjects,因此所有问题都可以通过转换本身的开销得到解决。
签出

在解决方案中的任意位置添加以下类(使用系统名称空间,这样它就可以在不添加任何引用的情况下随时使用)——


我不确定您是否会遇到此错误,因为您没有实施解决方案。我在局部视图中也犯了同样的错误。解决方案就是清理构建并重建它。如果语法正确,代码应该可以工作,但razor引擎可能无法正确更新代码更改。

这与具有内部属性的匿名类型无关 完全可以将匿名类型从视图传递到局部视图 今天我遇到了同样的问题,这与传递匿名类型及其固有的
内部属性的问题(直接)无关

因此,关于老年退休金计划的问题,@Lucas的回答是无关紧要的——尽管解决办法会奏效

在OPs问题中,匿名类型正从程序集X中的视图传递到程序集X中的分部,因此David Ebbo概述的匿名类型的内部属性问题无关紧要为视图、分部和匿名类型编译的类型都包含在同一程序集中

那么,是什么导致了将匿名类型从视图传递到部分视图的突然失败呢? 至少在我的情况下,我发现这是因为在同一文件夹中有另一个视图指定了无法解析的模型类型。视图是在运行时编译的,因此在运行时编译视图的失败也意味着编译动态类型的失败,并且分部将只接收一个
对象
。目前还不清楚发生了什么,但在OPs的具体示例中(和我的示例中),这很可能是问题的原因

有趣的是,如果模型类型是正确的,但是视图的另一部分没有编译,那么匿名类型就不会受到同样的影响。这必须取决于Razor如何分解视图组件的动态编译

一旦您纠正了有问题的视图,要么重新生成整个解决方案,要么在检查项目是否已修复之前清理并重新生成项目

为了确保您不会再次被此问题所困扰,您可以通过将其添加到
csproj
文件来启用Razor视图的编译时编译:

<PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

真的

要使用
动态
类型,您需要参考
Microsoft.CSharp
程序集

,而不是在局部视图中使用
动态
模型类型

您可以使用
@ViewData.Eval(“foo”)
而不是
@Model.foo
调用匿名对象属性

然后可以从视图中删除
@Model dynamic

我最近在为Facebook社交评论集成在视图之间传递一些属性时遇到了这个问题。示例代码:

Html.RenderPartial(@"Layouts/Partials/_Comments", new {currentUrl = Model.CurrentPage.GetAbsoluteUrl(), commentCount = 5 });
在我看来,我刚刚有了这个部门:

<div class="fb-comments" data-href="@ViewData.Eval("currentUrl")" data-numposts="@ViewData.Eval("commentCount")" data-width="100%"></div>

我通过使用字典解决了这个问题

 @Html.Partial("_Partial", new Dictionary<string, string> { { "Key1", "Val1" }, { "Key2", "Val2" }, { "Key3", "Val3" } });
@Html.Partial(“_-Partial”,新字典{{“Key1”,“Val1”},{“Key2”,“Val2”},{“Key3”,“Val3”});

不客气。也许这会增加M$,使匿名类型更有用,但这是否适用于Partials?我得到一个错误,部分不能动态调度…什么部分?你能提供一个例子吗?对我来说,先创建动态对象,然后再创建ExpandooObject,可能的重复似乎是不必要的开销。。。只需创建ExpandoObject即可..@Baz1nga您无法执行。。。新的Expando(){prop=value,…},这使它有问题。我正在使用Json.Net的JObject进行类似的使用。在那里使用HtmlHelper感觉不太对劲。。。public static ExpandoObject ToExpando(这个对象o){IDictionary expando=new ExpandoObject();foreach(o.GetType().GetProperties()中的var propertyInfo){expando.Add(new KeyValuePair(propertyInfo.Name,propertyInfo.GetValue(o,index:null));}return(ExpandoObject)expando;}编辑很好。我只是有同样的问题,不理解那里的WTF。谢谢你的解释。编辑#2建议现在(MVC>3)可以做标记为“错误”的行吗<代码>返回视图(新的{Foo=1,Bar=“test”})?因为我使用的是MVC4和st
Html.RenderPartial(@"Layouts/Partials/_Comments", new {currentUrl = Model.CurrentPage.GetAbsoluteUrl(), commentCount = 5 });
<div class="fb-comments" data-href="@ViewData.Eval("currentUrl")" data-numposts="@ViewData.Eval("commentCount")" data-width="100%"></div>
 @Html.Partial("_Partial", new Dictionary<string, string> { { "Key1", "Val1" }, { "Key2", "Val2" }, { "Key3", "Val3" } });