“System.Dynamic.DynamicObject”中没有“PropertyName”的定义。

39

我遇到了下一个问题:

我正在尝试运行 .NET MVC 网站,并使用 ViewBag 将一些数据传递给我的 View。 这是我设置 ViewBag 的方法。

[HttpGet]
[AllowAnonymous]
public ActionResult Start()
{
    ViewBag.BanReason = null;
    int userId;

    //Request with UserId, display ban reason if necessary
    if (Request.Params["UserId"] != null && int.TryParse(Request.Params["UserId"], out userId))
    {
        ViewBag.BanReason = CheckIfUserBanned(userId);
    }

    ViewBag.Users = MvcApplication.Users;

    return View();
}
当我为ViewBag分配值时(例如,ViewBag.BanReason = null;),我会得到RuntimeBinderException异常,其中包含以下消息:'System.Dynamic.DynamicObject'不包含'BanReason'的定义。我使用带有.NET 4.5的Visual Studio 2012和具有.NET 4.0的应用程序池的本地IIS服务器。在另一台配置相同的计算机上,所有工作都很好,没有抛出任何异常。请不要建议使用其他技术,如ViewData [“”]和创建单独的模型,因为我不想改变在其他机器上正常工作的代码。我认为这是配置错误问题。感谢任何猜测。谢谢。

请展示您使用 ViewBag.BanReason 的代码。 - Satpal
它被用在Start.cshtml中 @if (ViewBag.BanReason != null) { <script type="text/javascript"> showErrorPanel("@ViewBag.BanReason"); </script> } - Groove
1
你能贴出堆栈跟踪吗? - Slavo
http://pastebin.com/jWBJiTSn - Groove
2个回答

48

你的代码很好,ViewBag具有动态属性,在运行时所有属性都将被赋值。

这个异常是一个常见的CLR异常。尝试按照以下步骤操作,希望可以解决问题。 打开Visual Studio

  • 调试 --> 异常 --> (取消选中)公共语言运行时异常

如果仍然出现问题

  • 工具 --> 选项 --> 调试(展开) --> 一般 --> (选中)启用我的代码即可

希望可以帮到你,对我而言它有效。

点击此处查看详细图片


2
我认为这里的核心问题是DynamicObject使用try/catch像if/else一样,这对于性能来说不可扩展,特别是在循环中会破坏你的CPU。 - Kelly Elton
1
@KellyElton 我同意。CLR 似乎有一种依赖“预期”异常的习惯。这是一种相当令人担忧的设计实践,当您由于其他原因无法启用“仅我的代码”时,会使调试变得非常麻烦。 - Dan Bechard
在Visual Studio 2017中,您还可以转到:调试->选项,在选项弹出窗口中转到调试->常规,并选中“启用仅限我的代码”旁边的复选框。 - SemanticZen
非常棒的技巧,非常感谢。 - mostafakvd

3

我相信这是另一个stackoverflow答案中提到的你的问题:

从你的评论中可以看出,你在另一个控制器中设置了ViewBag.Message。ViewBag仅为由服务于视图的控制器设置的视图数据。

如果你需要从另一个控制器发送它,应该在你的操作方法中使用参数,然后你可以将ViewBag.Message设置为传入的参数。

ViewBag RuntimeBinderException (MVC 4, ASPX)


你还是得到了同样的异常吗? - Rick Azua
1
是的,我还在学习中。 - Groove

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