2010-02-28 5 views
0

J'utilise MVC. J'ai copié le formulaire de connexion à partir de la page de connexion et inséré dans une nouvelle page (contrôleur de la maison, vue d'index). J'ai copié le code du contrôleur de comptes dans la vue d'index. pour une raison quelconque, je ne suis toujours pas capable de me connecter. Je ne suis pas sûr de ce qui ne va pas car il semble que j'ai copié le code nécessaire exactement. Lorsque j'utilise le formulaire sur la page d'index, je ne reçois aucune erreur de validation, mais il me renvoie à la vue et je ne suis pas connecté.Le formulaire de connexion ne fonctionne pas sur la page d'index

Vous remarquerez que j'ai changé cette ligne pour rediriger à une page d'erreur, mais je ne me jusqu'ici:

// If we got this far, something failed, redisplay form 
      return RedirectToAction("Error", "Home"); 

J'ai posté le code ici: http://pastebin.com/RUj6ASvE

Répondre

1

C'est parce que vous envoyez des messages le de l'action de l'indice alors que vous devriez l'afficher à l'action LogOn , où votre logique d'authentification est activée.

Essayez de changer Html.BeginForm() à Html.BeginForm("LogOn", "HomeController") à votre avis. Vous avez présenté le formulaire à partir de l'action Index de HomeController. Et en le renvoyant à la même action du même contrôleur. Mais cette action ne traitait pas la logique d'authentification. Voilà pourquoi rien ne se passait et vous n'étiez pas vous connecter

Dans le défaut ASP.NET MVC 2 site, mais ils présentent la forme de l'action de LogOnAccountController.

public ActionResult LogOn() { 
    return View(); //returns the LogOn.aspx view 
} 

Alors Lorsqu'ils utilisent Html.BeginForm() dans la vue, ils créent un formulaire POST à ​​la même action du même contrôleur. Alors ils créent une autre action avec le nom LogOn:

[HttpPost] 
public ActionResult LogOn(LogOnModel model, string returnUrl) { 
    //... 
} 

Mais cette fois-ci, ils décorent cette action avec l'attribut HttpPost. Cela signifie que si une demande atteint l'action LogOn de avec le verbe POST, cette méthode ci-dessus sera exécutée. Mais si la même action est demandée avec le verbe GET (c'est-à-dire sans un corps POST), l'autre méthode sera exécutée.

Donc, fondamentalement, vous auriez pu faire cela dans votre HomeController:

public ActionResult Index() { 
    ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
    return View(); //returns the view which has the form 
} 

[HttpPost] 
public ActionResult Index(LogOnModel model, string returnUrl) { 
    //handles the post 
} 

Mais votre action (celui qui était censé gérer la logique d'authentification) a été nommé différemment. Et c'est pourquoi nous avions besoin de définir explicitement le contrôleur et le nom de l'action dans le Html.BeginForm("LogOn", "HomeController").

+0

c'était tout! Pouvez-vous me dire pourquoi, dans le formulaire LogOn, il n'était pas nécessaire que ce soit ainsi? Voici le code du contrôleur de connexion asp.net mvc standard et voir que j'ai copié à partir de: http://pastebin.com/xkLuazSi –

+0

@Jason Shultz, Lorsque vous définissez un formulaire avec 'Html.BeginForm()' il définit le formulaire attribut d'action à l'itinéraire actuel. La vue LogOn n'a donc pas besoin de définir explicitement le contrôleur et l'action car elle doit envoyer le formulaire au même contrôleur et à la même ** action **, mais avec la méthode POST. J'espère que cela à du sens. –

+0

Je comprends ce que vous dites, j'ai juste du mal à voir la différence entre/home/index et/accounts/logon. à mon oeil non averti, je ne vois pas la différence. –

Questions connexes