2009-03-22 11 views
1

J'expérimente avec ASP.NET MVC et Routes.Méthode publique pour chaque vue? ActionResult et routes par défaut dans ASP.MVC

Il semble que MVC me force à ajouter une méthode publique au contrôleur chaque fois que je veux créer une vue. Par exemple:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 

    //... a public method for every view.. :(
} 

Je ne souhaite pas créer de méthode publique pour chaque vue. Par défaut, je veux le comportement de "return View()" pour toutes les vues dans le système, sauf indication contraire.

Par exemple, HTTP GET:

 
site.com/about 
site.com/features 
site.com/ 
site.com/testimonials 
site.com/contact-us 

À l'heure actuelle, je dois ajouter:

HomeController.About() 
HomeController.Features() 
HomeController.Index() 
HomeController.Testimonials() 
HomeController.ContactUs() 

Tous les résultats dans "retour View()". C'est mon problème, j'essaie d'éliminer la création de méthodes d'action publique pour des vues simples.

Pour les vues qui nécessitent un traitement supplémentaire, comme une page Contactez-nous sur un HTTP POST à:

 
site.com/contact-us 

Je voudrais ajouter spécifiquement une méthode dans le contrôleur pour envoyer un message SMTP.


Voici un exemple plus concis de ce que je suis en train de faire:

public class HomeController{ 

    public ActionResult ShowBasicView(){ 
    //HTTP GET: 
    //site.com/about 
    //site.com/features 
    //site.com/ 
    //site.com/testimonials 

    //All URLs above map to this action 

    return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult ContactUs(FormCollection data){ 

    //HTTP POST: 
    //site.com/contact-us 

    //POST URL maps here. 

    SmtpClient.Send(new MailMessage()) //etc... 
    return View() 
    } 

} 

Merci, Brian

Répondre

3

Le problème potentiel d'avoir le ShowBasicView de votre édition est que, en raison du câblage implicite de vues, chacun de ces urls retournerez tous le même point de vue, à savoir:

\ Views \ Home \ ShowBasicView.aspx

Maintenant, cela pourrait être ce que vous voulez, même si c'est probablement improbable.

Vous pouvez éventuellement régler cela en ayant une voie telle que:

routes.MapRoute( 
    "ShowBasic", 
    "{id}", 
    new { controller = "Home", action = "ShowBasicView", id = "home" } 
); 

Et modifier votre contrôleur:

public class HomeController: Controller{ 

    public ActionResult ShowBasicView(string pageName){ 
    // Do something here to get the page data from the Model, 
    // and pass it into the ViewData 
    ViewData.Model = GetContent(pageName); 

    // All URLs above map to this action 
    return View(); 
    } 
} 

Par ailleurs, si le contenu est codé en dur dans les vues que vous pouvez essayer :

public class HomeController: Controller{ 

    public ActionResult ShowBasicView(string pageName){ 
    // All URLs above map to this action 
    // Pass the page name to the view method to call that view.   
    return View(pageName); 
    } 
} 

Vous devrez éventuellement également ajouter une route pour l'URL de base, comme la route ShowBasic ne frappera que pour une URL avec une valeur de chaîne.

+0

J'ai essayé ceci, mais pageName est nul à chaque requête. Pour rooter site.com/ et sur site.com/about. –

+0

l'ai eu! Merci! Fonctionne magnifiquement. –

+0

suffit de changer {id} en {pageName} et cela marchera dans la route.MapRoute() –

0

Je ne suis pas sûr que je comprends votre question? N'est-ce pas le routage standard? Vous omettez le {action} dans votre itinéraire et le coder par défaut pour les cas spécifiques?

http://www.asp.net/learn/mvc/tutorial-23-cs.aspx

+0

question Mise à jour, nous espérons qu'il est plus clair sur ce que je suis en train de faire. –

0

Vous pouvez ajouter la méthode suivante dans votre contrôleur, il

protected override void HandleUnknownAction(string actionName) 
{ 
    try{ 
     this.View(actionName).ExecuteResult(this.ControllerContext); 
    }catch(Exception ex){ 
     // log exception... 
     base.HandleUnknownAction(actionName); 
    } 
} 
Questions connexes