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

22

我从其他相关问题中了解到(其中包括这里这里),你不能将匿名类型对象从控制器传递到视图,因为匿名类型使用了内部访问器。视图和控制器代码编译成不同的程序集,因此尝试使用它会导致以下错误:

对象不包含“foo”的定义

这很好理解,虽然一开始有些恼人。有足够多的建议性解决方法可以满足我的需求。

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

Razor视图代码...

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

"Partial1"的部分视图代码

@model dynamic 

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

奇怪的是,在一个新的MVC项目开发的初期,这个功能是正常工作的,但随着我添加更多视图,它突然停止工作,并且现在给我了上述相同的错误。

好像我已经达到了一个阈值,视图和局部视图不再编译为同一程序集。但这只是我的猜测。

我想知道是否有人能够解决这个问题。


我曾经遇到过完全相同的问题。动态部分正常工作,突然之间却停止了。 - Chris Kemp
我从未弄清楚为什么。只能停止使用动态类型。因为有一个如此简单的解决方法,我无法证明再花更多时间去调查它是合理的。 - Andy McCluggage
我也遇到了完全相同的问题!有人找到解释了吗? - Arno 2501
6
作为另一种选择,您可以传递一个像 @Html.Partial("Partial1", new Dictionary<string, string> {{ "var1", "val1" }, { "var2", "val2" }} 这样的字典对象,然后在局部视图中可以通过 @Model["var1"] 来引用它。 - jbyrd
4个回答

13

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

使用@ViewData.Eval("foo")而不是@Model.foo

并删除您的@model dynamic line。没有必要。


2
不错。我已经阅读了很多关于这个令人沮丧的主题的内容。人们编写各种扩展程序等等。 这是一个真正简单的解决方案。 - Justin
它如何在模型列表中使用? - Anup Sharma

2
完整的详情请在此处查看问题和我的答案: MVC Razor动态模型,“object”不包含“PropertyName”的定义 基本上,它停止工作的最有可能的原因是因为您在同一个文件夹中有另一个视图,其模型类型无法解析。
纠正具有破损模型类型的有问题的视图,清理并重新构建解决方案,然后它应该可以再次工作。

2

我曾经无法解释为什么这个东西一开始能用,后来又不能用了,所以只好使用命名类型定义。虽然不是世界末日,但还是有点失望。这种情况非常适合使用动态类型。


1
那正是我的观点。这太过分散注意力,而且没有证明它值得我花时间,因为我有一个可行的替代方案(即强类型)。 - Chris Kemp

1
在ASP.NET Core中,您可以使用局部视图标签助手调用局部视图:
<partial name="MyPartialView" model='new { SomeProperty = "some value" }' />

然后,在局部视图中,只需省略@Model指令,你的Model就会显示出来。所以,在局部视图中,你可以像这样操作:
@{ var someProperty = Model.SomeProperty; }

哦,我甚至不记得写这个答案了。我想这意味着,在我的代码中潜藏着一个不再起作用的实例构造... - Bob.at.Indigo.Health

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