我一直致力于将 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 })