![](/img/trans.png)
[英]RuntimeBinderException when accessing dynamic anonymous type in view
[英]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.