7

Eventuali duplicati:
How do I register a controller that has been created in an AREAController divisi per aree

ho la domanda - è possibile fare la prossima?

ho tre Aree:

_Default 
SiteOne 
SiteTwo 

All'interno di ciascuna zona ho un ApiController con lo stesso nome, ma in diversi spazi dei nomi, naturalmente:

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

Ho anche avere un valore di corrente (che vorrei usare) Area in configurazione.

vorrei mappare all'utente di controller nella zona corretta (che posso trovare nella configurazione) se entra nel browser:

/api/values 

Per esempio, se Area corrente nel file di configurazione è SiteOne quindi questa richiesta dovrebbe essere mappata al controller MvcAppliaction.Areas.SiteOne.Controllers.ValuesController, ma se cambio l'area corrente nel file di configurazione su SiteTwo di _Default dovrebbe essere mappato per correggere il controller.

PS. Con il regolatore MVC è facile, basta impostare il percorso:

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

risposta

4

Il mio suggerimento sarebbe di implementare un DefaultControllerFactory personalizzato.

Si può vedere un ottimo esempio here

La fabbrica controller di default solo elenca tutti i controller di nome su una lista non permettendo per questo tipo di funzionalità. L'articolo sopra mostra come creare un nuovo factory e prendere il controllo della creazione del controller, consentendo di abbinare facilmente percorsi a specifici namespace.

Ciò darebbe la funzionalità che stai cercando.

+0

Grazie. Pensavo che ci fosse un altro modo. Quindi implementerò il factory dei controller HTTP. – Malkov

+0

Nessun problema felice di essere di aiuto – dmportella

12

Prova ad aggiungere la seguente istruzione using e modificando la registrazione percorso nel file 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

in questo caso, per accedere ai controllori che si devono scrivere _/siteone/o values_ _/sitetwo/values_. Ma voglio scrivere solo _/api/values_ e ottenere l'accesso al controller da Area che ho configurato nel file di configurazione. Ad esempio, se ho specificato SiteOne nel file di configurazione e ho chiamato l'url _/api/values_, otterrò il controller da SiteOne Area, e se cambierò l'area nel file di configurazione SiteTwo, se chiamerò _/api/values ​​/ Otterrò il controller SiteTwo. – Malkov

+0

Vorrei proporre 'nome: this.AreaName +" _API "' o qualsiasi convenzione di denominazione si adatta alle tue esigenze, quindi il nome della route sarà 'Admin_API' invece di solo' Admin'. Inoltre ho usato 'routeTemplate:" api/"+ this.AreaName +"/{controller}/{id} "' così posso accedervi con '/ api/admin/users/123'.Se ricevi 404 errori, probabilmente hai un conflitto con un'altra normale rotta MVC –