17

我一直致力于将 MVC4 项目转换为 MVC5。第一天我遇到了“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”,但能够通过重新开始转换来解决它。我不确定修复是什么,这很糟糕,因为它又发生了。

当我加载 Login.cshtml 页面时,错误发生在 _ExternalLoginsListPartial.cshtml 中。错误在第 15 行抛出。(字符串 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”类型的异常,但未在用户代码中处理

附加信息:“对象”不包含“动作”的定义

快照说

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

现在这很奇怪,因为当我设置断点时 Model.Action 不为空。我可以看到价值。

这真是令人沮丧。该应用程序在 5 分钟前运行。我在一个不相关的页面上更改了 html。现在它无法运行。

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

  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 })
4

7 回答 7

4

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

于 2013-11-06T06:22:12.403 回答
3

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

所以未来读到这个的人:尝试将visual studio 2013更新到至少更新2。

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

于 2014-07-10T11:47:26.067 回答
1

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

我在顶部有一个_ExternalLoginsListShoppingCartPartial.cshtml(来自我的 mvc4 项目) 。@model ICollection<AuthenticationClientData>我将其注释掉并重建解决方案,突然它起作用了。我什至没有在任何视图中使用该部分视图,所以这是一个非常讨厌的错误 imo。

所以检查你的项目。你可能有一些 mvc4/simplemembership 东西弄乱了你的 mvc5 项目。

于 2013-11-21T13:53:33.847 回答
1

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

于 2014-01-25T17:29:32.527 回答
1

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

@model XYZ.Models.ManageUserViewModel

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

于 2014-02-17T21:55:01.757 回答
1

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

于 2014-09-01T21:01:55.633 回答
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 }))
于 2013-11-04T20:01:09.150 回答