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

4voto

AKhooli Points 346

Vérifiez les vues du dossier Account et pour chacune d'entre elles qui possède un modèle explicite, assurez-vous que le modèle (de vue) se trouve dans le bon espace de noms. Passez la souris sur le paramètre m (m => m.UserName ... etc) et assurez-vous qu'il fait référence au bon (view)model. Dans mon cas, j'ai déplacé AccountViewModels dans un autre dossier et l'application s'est cassée comme ci-dessus. Il semble que les vues soient en quelque sorte en train de "mettre en cache" le modèle de l'espace de nom original. J'ai utilisé une solution idiote (j'ai commenté la ligne @model et je l'ai recommentée). J'ai reçu un avertissement comme quoi m est dynamique mais une fois construit et exécuté, cela a fonctionné. Il semble que ce soit un problème dans VS 2013 RTM.

2voto

Amy Points 73

Ce bogue a été vérifié par Microsoft, qui s'efforce de le corriger.

Donc si quelqu'un du futur lit ceci : essayez de mettre à jour Visual Studio 2013 au moins à la mise à jour 2.

https://connect.microsoft.com/VisualStudio/feedback/details/813133/bug-in-mvc-5-framework-asp-net-identity-modules

1voto

PussInBoots Points 1129

J'ai trouvé une solution pour mon propre projet (mvc5) après quelques expériences.

J'avais un _ExternalLoginsListShoppingCartPartial.cshtml (de mon projet mvc4) avec @model ICollection<AuthenticationClientData> en haut. Je l'ai commenté et j'ai reconstruit la solution et soudainement ça fonctionne. Je n'utilise même pas cette vue partielle dans aucune autre vue, c'est donc un bogue plutôt désagréable.

Vérifiez donc dans votre projet. Il se peut que des éléments de mvc4/simplemembership perturbent votre projet mvc5.

1voto

Kevin.A Points 60

J'ai eu la même erreur après avoir remplacé les modèles de compte dans un autre dossier. Lorsque j'ai vérifié chaque vue du dossier Account, j'ai découvert que mon fichier "Manage.cshtml" faisait référence à l'ancien espace de noms. Je l'ai remplacé par l'espace de noms correct pour mes modèles et l'erreur s'est corrigée.

1voto

Piers Lawson Points 142

Pour moi, j'avais modifié le contenu du ManageUserViewModel pour ajouter une propriété... J'ai ensuite commencé à obtenir l'erreur. Lorsque j'ai modifié le fichier Manage.cshtml pour passer de l'absence d'un modèle explicite à l'utilisation d'un modèle :

@model XYZ.Models.ManageUserViewModel

et supprimé les instructions using, ça a recommencé à fonctionner. Une heure de perdue !

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