我一直致力于将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 })
答案 0 :(得分:4)
检查Account文件夹中的视图以及每个具有显式模型的视图,确保(view)模型位于正确的命名空间中。将鼠标悬停在m参数(m =&gt; m.UserName ...等)上,并确保它引用了正确的(视图)模型。 就我而言,我将AccountViewModels移动到另一个文件夹,应用程序如上所述。看来这些视图是从原始命名空间“缓存”模型。我使用了一个愚蠢的修复程序(注释掉了@model行并且没有注释掉它)。得到警告m是动态的,但是在构建和运行时它是有效的。看起来像是VS 2013 RTM中的一个小故障。
答案 1 :(得分:3)
此错误已经过Microsoft验证,他们正在努力修复它。
所以来自未来的人都会这样做:尝试更新visual studio 2013至少更新2.
答案 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 }))