将匿名对象从视图传递到局部视图

时间:2012-02-16 16:06:15

标签: asp.net-mvc razor partial-views anonymous-types

我从各种其他相关问题herehere中了解到,您无法将匿名类型的对象从控制器传递到视图,因为匿名类型是使用内部访问器定义的。 View和Controller代码被编译到不同的程序集中,因此尝试使用它会导致此错误......

  

对象不包含'foo'

的定义

这很好,我可以接受,虽然起初很烦人。有足够的建议解决方法来安抚我。

但是,我认为您仍然可以将匿名类型从视图传递到局部视图,因为它们都是视图,它们将在同一个程序集中编译。

Razor查看代码......

@Html.Partial("Partial1", new { foo = "Something", bar = "Something else" })

和“Partial1”的部分视图代码

@model dynamic 

<h1>@Model.foo</h1>
<span>@Model.bar</span>

奇怪的是,这个WAS在一个新的MVC项目的开发开始工作,但是当我添加了更多的视图时它就停止了工作,现在给我的错误与上面提到的相同。

就好像我已达到一个阈值,在该阈值中视图和局部视图不再编译到同一个程序集中。但我只是在猜测。

我想知道是否有人可以解释这一点。

4 个答案:

答案 0 :(得分:12)

不知道它停止工作的原因,但这是解决方法。

使用@ViewData.Eval("foo")代替@Model.foo

并删除您的@model动态线。没有必要。

答案 1 :(得分:2)

我永远无法解释为什么这样做然后停止了,所以只需要使用命名类型定义。不是世界末日,而是令人失望。这种东西非常适合使用动态类型。

答案 2 :(得分:2)

有关详细信息,请在此处查看问题和答案:

MVC Razor dynamic model, 'object' does not contain definition for 'PropertyName'

基本上,它停止工作的最可能原因是因为你在同一文件夹中有另一个视图,其模型类型不可解析

使用损坏的模型类型更正违规视图,清理并重建解决方案,它应该再次起作用。

答案 3 :(得分:0)

在ASP.NET Core中,您可以使用局部视图标签帮助程序调用局部视图:

<partial name="MyPartialView" model='new { SomeProperty = "some value" }' />

然后,在部分视图中,只需省略@Model指令,瞧,您的Model就会显示出来。因此,在部分视图中,您可以执行以下操作:

@{ var someProperty = Model.SomeProperty; }