Méthode publique pour chaque point de vue? Par défaut ActionResult et Routes en ASP.MVC

StackOverflow https://stackoverflow.com/questions/671561

  •  21-08-2019
  •  | 
  •  

Question

J'expérimente avec ASP.NET MVC et Routes.

Il semble me forces MVC 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 veux pas créer une méthode publique pour chaque vue. Par défaut, je veux que le comportement de « retour View () » pour toutes les vues du 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 ()". Ceci est mon problème, je tente d'éliminer la création de méthodes d'action publique pour les 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.


Ce qui suit est 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

Était-ce utile?

La solution

Le problème potentiel à avoir la 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, mais il est probablement peu probable.

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 aurez éventuellement également d'ajouter une route pour l'URL de base, comme la route ShowBasic ne sera frappé d'une URL avec une valeur de chaîne.

Autres conseils

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top