Aggiunta del nome della società in Routes mvc 4

Ho cercato di fornire opzioni agli utenti come Facebook per aggiungere il nome della propria azienda nell’URL:

http://localhost:50753/MyCompany/Login 

Ho provato diversi URL, ma non ha funzionato.

 routes.MapRoute( name: "Default", url: "{companyName}/{controller}/{action}", defaults: new { controller = "Login", action = "Index"} ); routes.MapRoute( name: "Login", url: "{controller}/{action}/{id}", defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional } ); 

Ora, quando aggiungo questa route per farlo funzionare, tutte le mie richieste AJAX iniziano non riesce e quelle che riescono rappresentano HTML piuttosto che JSON. Quello che ho notato è che a causa di questo percorso, la mia pagina si ricarica di nuovo.

Qualcuno può aiutarmi a capire come può essere fatto usando il routing MVC (se è ansible, o se sto pensando nel modo sbagliato)?

Il problema che si verifica è dovuto al fatto che entrambi questi percorsi corrisponderanno a tutti gli URL con 1, 2 o 3 segmenti definiti (poiché il controller e l’azione hanno valori predefiniti). Poiché i percorsi vengono eseguiti in ordine dal percorso superiore al percorso in fondo, il percorso principale sarà sempre corrispondente e il percorso in basso non si abbinerà mai (eccetto per la home page).

Poiché la rotta principale corrisponde sempre, gli URL che presuppongono che il primo segmento è il controller e il secondo segmento è l’azione non riusciranno perché si companyName questi valori rispettivamente nelle chiavi companyName e route del controller .

Affinché funzioni come previsto, è necessario creare un vincolo di route che sia a conoscenza di tutti i nomi di società.

 routes.MapRoute( name: "Default", url: "{companyName}/{controller}/{action}", defaults: new { controller = "Login", action = "Index"}, constraints: new { companyName = "Company1|Comany2|Company3" } ); 

Si noti che è ansible implementare IRouteConstraint modo da poter estrarre i valori in modo che corrispondano da un modello di database memorizzato nella cache invece di codificarli nella configurazione. Vedi questo post per sapere come creare un vincolo del percorso personalizzato.

Oppure, come ha detto Andy, puoi rendere la partita univoca specificando uno o più segmenti dell’URL in modo esplicito.

 url: "{companyName}/Login" 

L’idea è che ci deve essere un modo per rendere il primo percorso che hai definito non corrisponde in alcuni casi.

In alternativa, è ansible implementare RouteBase , ma è necessario solo se si richiede un maggiore controllo sul processo di corrispondenza rispetto a questo semplice scenario.

Il problema è che non c’è modo di distinguere tra i tuoi due percorsi. Ad esempio / a / b / c potrebbe essere il percorso predefinito con company = a, controller = b, action = c o potrebbe essere la route di login con controller = a, action = b, id = c.

Per risolvere questo problema è necessario progettare i percorsi, compresi quelli per AJAX, in modo che non vi siano due percorsi che potrebbero avere lo stesso URL. Nel tuo esempio puoi semplicemente rilasciare / {id} dalla rotta di accesso perché non è necessario. Specificare inoltre l’URL in modo più specifico e inserirlo prima del valore predefinito. Questo ti darebbe qualcosa di simile

 routes.MapRoute( name: "Login", url: "{companyName}/Login", defaults: new { controller = "Login", action = "Index" } ); routes.MapRoute( name: "Default", url: "{companyName}/{controller}/{action}", defaults: new { controller = "Login", action = "Index"} ); 

In questo caso, sia / MyCompany / Login e / MyCompany / Login / Index andrebbero alla pagina di accesso. Tuttavia MyCompany / Home / Index andrebbero su controller = Home, action = Index.

Personalmente, tendo a rimuovere del tutto la route predefinita in modo da poter specificare gli URL che voglio piuttosto che averli tutti come / controller / azione. Questo ti dà più controllo, ma significa specificare ogni percorso individualmente.