15 votes

MVC5 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

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

1voto

Ed Kaim Points 30

J'ai également rencontré ce problème avec VS 2013 U3. Je venais d'ajouter un champ d'adresse électronique à RegisterViewModel avec l'attribut [EmailAddress], et le système plantait lorsque j'essayais de visiter la page d'enregistrement. La mise en commentaire de l'attribut [EmailAddress] a réglé le problème. Cependant, il a continué à fonctionner après que j'ai réintroduit l'attribut, il s'agit donc probablement d'un problème plus large qui pourrait être lié aux modifications apportées aux classes du modèle.

0voto

user2918406 Points 1

Oui, j'ai remplacé le code "else" par le suivant et cela fonctionne, mais j'essaie toujours de comprendre pourquoi cela ne fonctionne pas avec 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 }))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X