7

Duplicar posibles:
How do I register a controller that has been created in an AREAcontroladores divididos por áreas

tengo la pregunta - ¿es posible hacer lo siguiente?

tengo tres áreas:

_Default 
SiteOne 
SiteTwo 

Dentro de cada área tengo un ApiController con el mismo nombre, pero en diferentes espacios de nombres de curso:

MvcAppliaction.Areas._Default.Controllers.ValuesController 
MvcAppliaction.Areas.SiteOne.Controllers.ValuesController 
MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController 

que también tienen un valor de la corriente (que me gustaría usar) Área en la configuración.

me gustaría Mapa de usuario al controlador en el área adecuado (que puedo encontrar en la configuración) si entra en el navegador:

/api/values 

Por ejemplo, si el área actual en el archivo de configuración es SiteOne entonces esta solicitud debe asignarse al controlador MvcAppliaction.Areas.SiteOne.Controllers.ValuesController, pero si cambio el Área actual en el archivo de configuración a SiteTwo of _Default, debe asignarse al controlador correcto.

PS. Con controlador MVC es fácil, sólo tiene que fijar su ruta:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { "MvcApplication.Web.Areas." + SiteName + ".Controllers") } 
); 

Respuesta

4

Mi sugerencia sería implementar una DefaultControllerFactory personalizada.

Se puede ver un ejemplo muy bueno here

La fábrica controlador por defecto simplemente enumera todos los controladores por nombre en una lista que no permite este tipo de funcionalidad. El artículo anterior le muestra cómo crear una fábrica nueva y tomar el control de la creación del controlador, lo que le permite hacer coincidir fácilmente las rutas con el espacio de nombres específico.

Eso le daría la funcionalidad que está buscando.

+0

Gracias. Pensé que hay otra manera. Por lo tanto, implementaré la fábrica de controladores HTTP. – Malkov

+0

No hay problema de estar contento de ayudar – dmportella

12

Trate de añadir la siguiente instrucción using y modificando el registro de rutas en el archivo de AreaRegistration.cs.

using System.Web.Http; 
... 
public override void RegisterArea(AreaRegistrationContext context) 
{ 
     context.Routes.MapHttpRoute(
      name: this.AreaName, 
      routeTemplate: this.AreaName + "/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
} 
+0

en este caso, para acceder a los controladores que tienen que escribir _/SiteOne/o FACTORES DESTACADOS_ _/sitetwo/values_. Pero quiero escribir simplemente _/api/values_ y obtener el acceso al controlador desde el Área que configuré en el archivo de configuración. Por ejemplo, si especifico SiteOne en el archivo de configuración y llamé a url _/api/values_ obtendré el controlador desde el Área de SiteOne, y si cambiaré el área en el archivo de configuración SiteTwo, entonces si llamaré _/api/values ​​/ obtendré el controlador SiteTwo. – Malkov

+0

Me gustaría proponer 'name: this.AreaName +" _API "' o la convención de nomenclatura que más le convenga, por lo que el nombre de la ruta será 'Admin_API' en lugar de' Admin'. Además, he usado 'routeTemplate:" api/"+ this.AreaName +"/{controller}/{id} "' para poder acceder a él con '/ api/admin/users/123'.Si obtienes errores 404 entonces probablemente tengas un conflicto con otra ruta MVC normal –

Cuestiones relacionadas