繁体   English   中英

RuntimeBinderException 与 MVC 中的动态匿名对象

[英]RuntimeBinderException with dynamic anonymous objects in MVC

编码

我有一个 MVC 项目,其部分页面看起来像这样:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<div class="tab-window <%= Model.TargetClass %> <%= Model.TargetTab == Model.SelectedTab ? "selected" : "" %>"
    data-window-url="/SomeUrl/Partial/<%= Model.TargetTab %>/"
    <%= Model.TargetTab == Model.SelectedTab ? "data-content-loaded=\"true\"" : "" %>>
    <% if (Model.TargetTab == Model.SelectedTab) {
           Html.RenderPartial(Model.TargetTab as string, Model.Model as object);
        } %>
</div>

What it does is open another partial (the one named in Model.TargetTab ) with Model.Model if it's the currently visible tab, otherwise just renders an empty div (which is loaded with jQuery when needed).

它是这样称呼的:

<% Html.RenderPartial("TabWindowContainer", new { TargetTab = "MyTabName", TargetClass = "my-tab-class", SelectedTab = Model.Tab, Model = Model }); %>

这曾经奏效。

然后我更改了进入Model的值,它停止工作。 我改回来了,还是不行。 需要明确的是, hg status 目前不显示任何这些文件。

例外

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a definition for 'TargetClass'

当您尝试在 Quickwatch window 中打开Model时,您会看到它具有正确值的所有属性设置

快速手表

但是当您尝试查看任何属性时,您会遇到与以前相同的异常

快速观看异常

想了想,我意识到可能,这根本不应该工作; 我们尝试访问的 object 来自不同的程序集,因此我们看不到它的属性。 但是,为什么它曾经工作呢? 我仍然有一个可以运行的版本。 我该怎么做才能让它再次工作?

更新:它应该工作; model 来自同一组件中的另一个视图,而不是来自 controller。

您的动态类型在匿名类型中找不到属性,因为匿名类型的属性是内部的(不是公共的)。 因此,即使匿名类型的属性对调试器可见,您的应用也会引发异常。 参考。

创建一个 Expando 扩展方法。

public static ExpandoObject ToExpando(this object anonymousObject)
            {
                IDictionary<string, object> anonymousDictionary = new RouteValueDictionary(anonymousObject);
                IDictionary<string, object> expando = new ExpandoObject();
                foreach (var item in anonymousDictionary)
                    expando.Add(item);
                return (ExpandoObject)expando;
            }

像这样应用扩展。

<% Html.RenderPartial("TabWindowContainer", new { TargetTab = "MyTabName", TargetClass = "my-tab-class", SelectedTab = Model.Tab, Model = Model }.ToExpando()); %>

希望这会奏效,我并没有因为误解这个问题而让自己难堪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM