9

Nous pouvons une application MVC qui utilise les conventions de dossiers par défaut pour les vues HTML, mais nous souhaitons configurer un autre dossier "Services" avec des contrôleurs utilisés uniquement pour les services Web renvoyer xml ou json.Définition d'un emplacement de dossier de contrôleur secondaire dans ASP.NET MVC

Ainsi la route «/Services/Tâches/Liste » seraient acheminés vers « /Services/TaskService.cs », tandis que «/tâches/liste » seraient acheminés à la norme « /Controllers/TaskController.cs »

Nous souhaitons conserver les contrôleurs de service séparés des contrôleurs de vue. Nous ne pensons pas que les zones ou l'utilisation d'un autre projet fonctionnera. Quelle serait la meilleure façon d'aborder cela?

Répondre

9

Vous pouvez le faire en utilisant Routage et en conservant les contrôleurs dans des espaces de noms distincts. MapRoute vous permet de spécifier l'espace de noms correspondant à un itinéraire.

Exemple

Compte tenu de ces contrôleurs

namespace CustomControllerFactory.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return new ContentResult("Controllers"); 
     } 
    } 
} 

namespace CustomControllerFactory.ServiceControllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return new ContentResult("ServiceControllers"); 
     } 
    } 
} 

Et le routage suivant

routes.MapRoute(
      "Services", 
      "Services/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new string[] { "CustomControllerFactory.ServiceControllers" } // Namespace 
     ); 


     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new string[] { "CustomControllerFactory.Controllers"} // Namespace 
     ); 

Vous devez vous attendre les réponses suivantes

/Services/Accueil

ServiceController

/Accueil

Contrôleurs

+0

Vous pouvez le faire et renvoyer un 'ContentResult' ou tout résultat non-affichage, rappelez-vous juste si vous décidez de retourner n'importe quel type de vue, vous aurez besoin de cre mangé un moteur de vue personnalisé. – Ahmad

+1

Oui, la réponse ci-dessus ne résout que la partie routage du problème. Si vous renvoyez un ViewResult, vous devez modifier les conventions pour choisir la vue. Si vous choisissez d'implémenter un moteur de vue personnalisé, [this] (http: // stackoverflow.com/questions/799838/asp-net-mvc-comment-spécifier-quel-dossier-le-view-pages-résident-dans/809676 # 809676) pourrait aider. Vous pouvez également essayer de baser vos contrôleurs de service sur une classe de base qui remplace View() et implémente vos conventions à cet endroit. Il serait bon de savoir quel chemin vous prenez. – CGK

0

Si vous voyez des noms de dossiers jaunes Ajouter un dossier Nom dans la racine

Après, vous devez modifier routes.MapRoute dans "App_Start> RouteConfig"

Modifier d'itinéraire par défaut

routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id =  UrlParameter.Optional }, 
      new string[] { "mvcPartialView.HomeController" } // Namespace 
    ); 

et Ajouter cette

routes.MapRoute(
     "ApiControllerOne", // Name of folder 
     "ApiControllerOne/{controller}/{action}/{id}", 
     new { controller = "ApiFactory", action = "callFactoryOne", id = UrlParameter.Optional }, 
     new string[] { "mvcPartialView.ApiControllerOne" } // Namespace 
    );