MVC5 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

时间:2013-10-28 02:43:44

标签: asp.net-mvc dynamic

我一直致力于将MVC4项目转换为MVC5。第一天我遇到了'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'但是能够通过开始转换来解决它。我不确定这个修复是什么,这是一个无赖,因为它再次发生。

当我加载Login.cshtml页面时,_ExternalLoginsListPartial.cshtml中出现错误。第15行引发错误。(string action = Model.Action;)

@using Microsoft.Owin.Security

@{
    var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();
    var authenticationDescriptions = loginProviders as AuthenticationDescription[] ?? loginProviders.ToArray();
    if (!authenticationDescriptions.Any())
    {
        <div>
            <p>There are no external authentication services configured. See <a href="http://go.microsoft.com/fwlink/?LinkId=313242">this article</a>
            for details on setting up this ASP.NET application to support logging in via external services.</p>
        </div>
    }
    else
    {
        string action = Model.Action;
        string returnUrl = Model.ReturnUrl;
        using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl }))
        {
            @Html.AntiForgeryToken()
            <div id="socialLoginList">
                <p>
                @foreach (AuthenticationDescription p in authenticationDescriptions)
                {
                    <button type="submit" class="btn btn-default padded-8 margin-8" id="@p.AuthenticationType" name="provider" 
                            value="@p.AuthenticationType" title="Log in using your @p.Caption account">

                        <img src="@Url.Content("~/Content/Brands/"+p.Caption+".png")" alt="Microsoft" class="img-responsive" />
                        <br/>
                        <b>@p.Caption</b>
                    </button>
                }
                </p>
            </div>
        }
    }
}

抛出的错误是

  

System.Core.dll中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常,但未在用户代码中处理

     

其他信息:'object'不包含'Action'的定义

快照说

  

消息:对象'不包含'Action'的定义   来源:匿名托管DynamicMethods程序集

现在这是双重奇怪的,因为当我设置断点时,Model.Action不为null。我可以看到价值。

这真令人沮丧。该应用程序在5分钟前工作..我已经在非相关页面上更改了html ..现在它无法正常工作。

Hackish Fix 我宁愿知道为什么会发生这种错误。也就是说,我有一个快速解决方案,以防其他任何人遇到这个问题( 因为这是默认解决方案的一部分 )。解决方案是不使用动态。创建自己的viewmodel并传递它。

  public class ExternalLoginViewModel
{
    [Display(Name = "ReturnUrl")]
    public string ReturnUrl { get; set; }

    [Required]
    [Display(Name = "Action")]
    public string Action { get; set; }
}

 @Html.Partial("_ExternalLoginsListPartial", new ExternalLoginViewModel { Action = "ExternalLogin", ReturnUrl = ViewBag.ReturnUrl })

7 个答案:

答案 0 :(得分:4)

检查Account文件夹中的视图以及每个具有显式模型的视图,确保(view)模型位于正确的命名空间中。将鼠标悬停在m参数(m =&gt; m.UserName ...等)上,并确保它引用了正确的(视图)模型。 就我而言,我将AccountViewModels移动到另一个文件夹,应用程序如上所述。看来这些视图是从原始命名空间“缓存”模型。我使用了一个愚蠢的修复程序(注释掉了@model行并且没有注释掉它)。得到警告m是动态的,但是在构建和运行时它是有效的。看起来像是VS 2013 RTM中的一个小故障。

答案 1 :(得分:3)

此错误已经过Microsoft验证,他们正在努力修复它。

所以来自未来的人都会这样做:尝试更新visual studio 2013至少更新2.

https://connect.microsoft.com/VisualStudio/feedback/details/813133/bug-in-mvc-5-framework-asp-net-identity-modules

答案 2 :(得分:1)

经过一些实验后找到了我自己(mvc5)项目的解决方案。

我有一个_ExternalLoginsListShoppingCartPartial.cshtml(来自我的mvc4项目),顶部有@model ICollection<AuthenticationClientData>。我对它进行了评论并重建了解决方案,突然之间就可以了。我甚至没有在任何视图中使用那个局部视图,所以这是一个非常讨厌的bug imo。

请检查您的项目。你可能有一些mvc4 / simplemembership的东西搞砸了你的mvc5项目。

答案 3 :(得分:1)

将帐户模型替换为另一个文件夹后,我遇到了同样的错误。当我仔细检查Account文件夹下的每个视图时,我发现我的“Manage.cshtml”引用了旧命名空间。我将其更改为正确的模型命名空间并修复了错误。

答案 4 :(得分:1)

对我来说,我已经更改了ManageUserViewModel的内容以添加属性......然后我开始收到错误。当我将Manage.cshtml从不使用显式模型更改为使用:

@model XYZ.Models.ManageUserViewModel

并删除了using语句,它又开始工作了。浪费了一个小时!

答案 5 :(得分:1)

我也用VS 2013 U3来解决这个问题。我刚刚使用[EmailAddress]属性向RegisterViewModel添加了一个电子邮件字段,当我尝试访问Register页面时它崩溃了。注释掉[EmailAddress]属性修复了该问题。但是,在我重新添加属性之后它继续工作,所以这可能是一个更广泛的问题,可能与模型类的更改有关。

答案 6 :(得分:0)

是的,我用以下内容替换了“else”代码及其工作但仍在尝试查看使用Model.Action时无效的原因?

//string action = Model.Action;
//string returnUrl = Model.ReturnUrl;
//using (Html.BeginForm(action, "Account", new { ReturnUrl = returnUrl }))
using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = ViewBag.ReturnUrl }))