我一直在努力将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> } } }
抛出的错误是
An exception of type ‘Microsoft.CSharp.RuntimeBinder.RuntimeBinderException’ occurred in System.Core.dll but was not handled in user code
Additional information: ‘object’ does not contain a definition for ‘Action’
快照说
Message : object’ does not contain a definition for ‘Action’
Source : Anonymously Hosted DynamicMethods Assembly
现在这是双重的,因为当我设置一个断点Model.Action不为null。我可以看到价值。
这真的令人沮丧。该应用程序工作5分钟前..我已经更改了一个非相关页面上的html,现在它不工作。
黑客修复
我宁愿知道为什么这个错误发生。也就是说,我有一个快速的修复,以防其他人遇到这个(因为这是默认解决方案的一部分)。解决方案是不使用动力学。创建您自己的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 })