2009-12-07 3 views
2

Je suis nouveau à ASP.MVC. Mon expérience est dans ASP.NET Web Forms, je pense que c'est ce qui cause ma confusion. Je comprends que le «M» représente essentiellement la source de données, le «V» représente la ressource que je demande et le «C» dicte ce qui est montré à un utilisateur final. Mais ensuite je suis confus. Par exemple, j'essaie simplement de créer un écran de connexion. J'envisage un utilisateur visitant "http://www.myapp.com/Account/Login" et ils seront présentés avec un écran de connexion traditionnel. Pour ce faire, je l'ai ajouté ce qui suit dans la méthode RegisterRoutes dans mon fichier Global.asax:ASP.NET MVC - Approche de navigation

routes.MapRoute(
    "Login", 
    "{controller}/{action}", 
    new { controller = "Account", action = "Login", id = "" } 
); 

L'action de connexion exécute, mais c'est là que je deviens confus. Vous voyez, la première fois que l'écran de connexion se charge, je voudrais juste afficher un champ nom d'utilisateur/mot de passe. Ensuite, en post, je m'attendrais à ce que le formulaire soit validé et traité. Pour tenter de le faire, j'ai créé la méthode suivante:

public ActionResult Login() 
{ 
    bool isFormValid = ValidateForm(); 
    if (isFormValid) 
    LoginUser(); 
    else 
    ShowErrors(); 

    return View(); 
} 

Ma confusion repose sur l'action Login. Au départ, il n'y a pas de données. Mais la prochaine fois, je veux valider les données. Comment puis-je déterminer si l'action est une publication ou non?

Merci!

Répondre

8

La manière la plus simple de gérer cela est de deux actions: une pour obtenir, une pour la publication. Utilisez l'attribut AcceptVerbs pour contrôler qui est appelé en fonction de la méthode. BTW, les routes par défaut devraient fonctionner très bien pour ce cas puisque lorsque le contrôleur et l'action est fourni, il est dirigé comme prévu. Je pensais que ce scénario était également couvert dans le modèle de projet - avez-vous mis en place un projet en utilisant le modèle ou un modèle vide?

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Login() 
{ 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Login(string userName, string password) 
{ 
} 
2

Vous avez besoin de deux méthodes différentes, pour Post et Get.

[AcceptVerbs (HttpVerbs.Get] 
public ActionResult Login() 
{ 
    return View(); 
} 

[AcceptVerbs (HttpVerbs.Post] 
public ActionResult Login (FormCollection form) 
{ 
    if (AuthenticationSuccess()) 
     return RedirectToAction ("Account"); 
    else 
     return View(); 
} 

Pour la version post, vous pouvez utiliser le mécanisme de liaison du modèle:

public ActionResult Login (LoginModel loginModel) 

Ou

public ActionResult Login (string LoginName, string Password) 
Questions connexes