1 votes

MVC Appel d'une action d'un autre contrôleur

J'ai lancé un projet MVC et il a créé la classe AccountController pour moi. Ainsi, pour me connecter à mon site actuel, je dois me rendre sur localhost:2500. \Account.mvc\LogOn

Je voulais faire le login sur mon HomeController dans la vue Index. Ainsi, si vous allez à la racine du site et que vous n'êtes pas authentifié, vous devez vous connecter pour aller ailleurs.

J'ai donc ajouté le formulaire à ma vue Index et j'ai essayé de l'envoyer à ma vue Account en appelant l'action LogOn. vue Compte en appelant l'action LogOn.

J'ai appelé la méthode BeginForm en lui passant mon action et la vue respective (LogOn, Account). Lorsque je clique sur le bouton, il ne s'affiche pas dans la vue Account et n'exécute donc pas l'action LogOn. Au lieu de cela, il affiche simplement la vue Accueil en appelant à nouveau l'action Index. Cela ne m'apporte donc rien... haha.

Je ne suis pas sûr de ce que je fais mal. Vous trouverez ci-dessous le code brut de mon formulaire à partir de Home/Index.aspx, puis je vous montrerai également le code source une fois qu'il aura été rendu avant d'appuyer sur le bouton d'ouverture de session.

Voici mon code à partir de Home/Index.aspx :

  <% using (Html.BeginForm("LogOn", "Account")) { %>
            <div>
                <fieldset>
                    <legend>Account Information</legend>
                    <p>
                        <label for="username">Username:</label>
                        <%= Html.TextBox("username") %>
                        <%= Html.ValidationMessage("username") %>
                    </p>
                    <p>
                        <label for="password">Password:</label>
                        <%= Html.Password("password") %>
                        <%= Html.ValidationMessage("password") %>
                    </p>
                    <p>
                        <%= Html.CheckBox("rememberMe") %> <label class="inline" for="rememberMe">Remember me?</label>
                    </p>
                    <p>
                        <input type="submit" value="Log On" />
                    </p>
                </fieldset>
            </div>
        <% } %>

Voir la source de Home.mvc/Index :

<form action="/Account.mvc/LogOn" method="post">
    <div>
        <fieldset>
            <legend>Account Information</legend>
            <p>
                <label for="username">Username:</label>
                <input id="username" name="username" type="text" value="" />

            </p>

            <p>
                <label for="password">Password:</label>
                <input id="password" name="password" type="password" />

            </p>
            <p>
                <input id="rememberMe" name="rememberMe" type="checkbox" value="true" /><input name="rememberMe" type="hidden" value="false" /> <label class="inline" for="rememberMe">Remember me?</label>
            </p>

            <p>
                <input type="submit" value="Log On" />
            </p>
        </fieldset>
    </div>
</form>

J'ai défini un point d'arrêt au niveau de mon action de connexion et il n'est jamais atteint, donc ce n'est pas non plus une erreur de connexion.

Il semble que l'action dans la source html soit correctement définie, mais je ne comprends pas pourquoi elle ne s'affiche pas correctement. Je ne fais pas quelque chose de correct. Faites-moi savoir si vous avez des idées. Merci.

Action de connexion dans la vue du compte :

[AcceptVerbs(HttpVerbs.Post)]
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
            Justification = "Needs to take same parameter type as Controller.Redirect()")]
        public virtual ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
        {

            if (!ValidateLogOn(userName, password))
            {
                return View();
            }

            FormsAuth.SignIn(userName, rememberMe);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

1voto

Dan Atkinson Points 6043

Pouvez-vous confirmer que /Account.mvc/LogOn est une route valide ?

Des choses à vérifier :

  • L'itinéraire est-il valable ?

  • L'action LogOn comporte-t-elle un ActionVerb qui empêche les requêtes postales - telles que : [ActionVerbs(HttpVerbs.Get)]

Editar: En regardant votre code, sans tenir compte du fait que le point d'arrêt. est redirigé vers la page d'accueil, puisque vous ne passez pas le returnUrl, ne vous renverra-t-il pas simplement vers la page d'accueil en cas de succès ?

Mettez ça dans votre page principale. Qu'est-ce que ça donne ?

<%=Request.IsAuthenticated %>

Edit 2 :

Apparemment, cette réponse est fausse.

Ok... Donc le contrôleur est correct, et la vue semble correcte, et rend l'url correcte... Je suppose que ASP.NET MVC est installé et se trouve dans le GAC, étant donné que vous pouvez aussi naviguer vers d'autres urls comme LogOn directement. Et il semble que vous l'exécutez sous Windows XP, étant donné le '.mvc' dans la route.

A quoi ressemblent vos itinéraires ? Les avez-vous modifiés ?

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