J'ai travaillé sur la conversion d'un projet MVC4 en MVC5. Le premier jour, j'ai rencontré une 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' mais j'ai pu la résoudre en recommençant ma conversion. Je ne suis pas sûr de la solution, ce qui est dommage, car cela s'est reproduit.
L'erreur se produit dans _ExternalLoginsListPartial.cshtml lorsque je charge la page Login.cshtml. L'erreur se produit à la ligne 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>
}
}
}
L'erreur déclenchée est la suivante
Une exception de type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' s'est produite dans System.Core.dll mais n'a pas été gérée dans le code utilisateur.
Information complémentaire : "object" ne contient pas de définition pour "Action".
L'instantané dit
Message : 'object' ne contient pas de définition pour 'Action'. Source : Assemblée DynamicMethods hébergée de manière anonyme
Maintenant, c'est doublement bizarre car lorsque je place un point d'arrêt, Model.Action n'est pas nul. Je peux voir la valeur.
C'est vraiment frustrant. L'application fonctionnait il y a 5 minutes J'avais changé le html sur une page non liée et maintenant ça ne fonctionne pas.
Hackish Fix J'aimerais plutôt savoir pourquoi cette erreur se produit. Cela dit, j'ai une solution rapide au cas où quelqu'un d'autre rencontrerait ce problème ( Parce que c'est une partie de la solution par défaut ). La solution consiste à ne pas utiliser la dynamique. Créez votre propre modèle de vue et passez-le.
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 })