【问题标题】:Passing anonymous objects from a view to a partial view将匿名对象从视图传递到局部视图
【发布时间】:2012-03-08 01:12:33
【问题描述】:

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

对象不包含 'foo' 的定义

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

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

Razor 查看代码...

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

以及“Partial1”的部分视图代码

@model dynamic 

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

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

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

我想知道是否有人可以对此有所了解。

【问题讨论】:

  • 我确实遇到了这个问题。动力学正在处理部分,但突然停止了。
  • 我从来不知道为什么。不得不停止使用动态类型。因为有这么简单的解决方法,我无法证明花更多时间调查它是合理的
  • 我遇到了同样的问题!有人找到解释了吗?
  • 作为替代方案,您可以传入一个字典对象,如@Html.Partial("Partial1", new Dictionary&lt;string, string&gt; {{ "var1", "val1" }, { "var2", "val2" }},然后在部分中您可以通过@Model["var1"]引用它

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


【解决方案1】:

我一直无法解释为什么它会起作用然后停止,所以只能求助于使用命名类型定义。不是世界末日,而是令人失望。这种东西非常适合使用动态类型。

【讨论】:

  • 这正是我的看法。考虑到我有一个可行的替代方案(即强类型),这太让人分心了,并不能证明我的时间是合理的。
【解决方案2】:

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

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

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

【讨论】:

  • 不错。我已经阅读了很多关于这个令人痛苦的话题。人们编写扩展程序和各种各样的东西。这是一个非常简单的解决方案。
  • 如何在模型列表中使用?
【解决方案3】:

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

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

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

用损坏的模型类型更正有问题的视图,清理并重建解决方案,它应该可以再次工作。

【讨论】:

    【解决方案4】:

    在 ASP.NET Core 中,您可以使用局部视图标记助手调用局部视图:

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

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

    @{ var someProperty = Model.SomeProperty; }
    

    【讨论】:

    • 嗯。我什至不记得写过这个答案。我想这意味着,潜伏在我的代码中的某个地方,我有一个不再有效的构造实例......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多