È ansible, in MVC3, avere lo stesso nome del controller in aree diverse?

In MVC3, ho le seguenti aree:

  • Mobile
  • sandbox

Quindi ho percorso mappe come questa:

context.MapRoute( "Sandbox_default", "Sandbox/{controller}/{action}/{id}", new { controller = "SandboxHome", action = "Index", id = UrlParameter.Optional } 

e

  context.MapRoute( "Mobile_default", "Mobile/{controller}/{action}/{id}", new { controller = "MobileHome", action = "Index", id = UrlParameter.Optional } ); 

Il problema è che dà url come:

http: // localhost: 58784 / Mobile / MobileHome

e

http: // localhost: 58784 / Sandbox / SandboxHome

Ma lo voglio così:

http: // localhost: 58784 / Cellulare / Casa
http: // localhost: 58784 / Sandbox / Casa

Il problema è quando rinominare il SandboxHome-Controller in Home e il MobileHome-Controller in Home, che darebbe gli URL desiderati, non verrà compilato, dicendo che ha due classi per HomeController.

Come posso avere lo stesso nome del controller in aree diverse?

Sì.

Come spiegato da questo post sul blog: http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx

Supponendo che tu abbia una chiamata a RegisterAllAreas e ai file AreaRegistration generati da Visual Studio. Tutto quello che devi fare è lo spazio dei nomi sulla rotta predefinita in ASAX globale per evitare conflitti.

 //Map routes for the main site. This specifies a namespace so that areas can have controllers with the same name routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[]{"MyProject.Web.Controllers"} ); 

Finché si mantengono i controller Area all’interno dei propri spazi dei nomi. Questo funzionerà.

Sì, ma dovrai cambiare il tuo routing:

 context.MapRoute( "Default", "{area}/{controller}/{action}/{id}", new { area = "Mobile", controller = "Home", action = "Index", id = UrlParameter.Optional } ); 

Potresti anche tenere entrambe le rotte ma non dimenticare di definire l’ area nelle impostazioni predefinite.

Importante

Ovviamente è necessario mantenere i controller nei propri spazi dei nomi di zona:

 namespace MyApp.Areas.Mobile.Controllers { public class HomeController : Controller { ... } } namespace MyApp.Areas.Sandbox.Controllers { public class HomeController : Controller { ... } } 

Controlla questo link su MSDN e guarda la procedura. E non dimenticare di controllare questo articolo MSDN che parla della registrazione dell’area, perché dovrai chiamare il metodo RegisterAllAreas() .

E dal momento che vuoi ancora mantenere i controller originali non area, dovresti anche leggere questo articolo di Phil Haack come fare (Credit dovrebbe andare a @Rob nella sua risposta per indicare prima questo post sul blog).