2012-10-28 4 views
5

Ho un sito con una struttura di percorso "generale" e un'area aggiuntiva "Traduci". Così al livello più alto, hai qualcosa di simile:Routing ASP.NET MVC: tutto sembra corrispondere al modello di percorso corretto, ma non funziona

  • /
  • /Chi ("generico")
  • /Tradurre (area)

All'interno dell'area Tradurre, ho:

  • /Tradurre/Word (WordController, azione Index)
  • /Tradurre/Word/Aggiungi (WordControll ehm, Aggiungi azione)
  • /Tradurre/Word/Migliorare (WordController, migliorare l'azione)

Tutti questi lavori.

Tuttavia, non appena aggiungo un ulteriore controller alla struttura esistente, ad es. Definizione ...

  • /Tradurre/Definizione (azione DefinitionController, Index)
  • /Tradurre/Definizione/Aggiungi (DefinitionController, Aggiungi azione)

o di pronuncia ...

  • /Translate/Pronuncia (PronunciationController, azione Index)
  • /Translate/Pronuncia/Aggiungi (PronunciaController, Aggiungi acti on)

Tutto quello che ottiene è un 404.

configurazione del routing della mia zona è qui sotto:

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Translate_direct", 
      "Translate/{controller}/{action}", 
      new { action = "Index", controller = "Default", } 
     ); 
     context.MapRoute(
      "Translate_default", 
      "Translate/{toLanguageCode}/{query}/{fromLanguageCode}/{controller}/{section}/{action}/{id}", 
      new { action = "Index", controller="Default", id = UrlParameter.Optional, section=UrlParameter.Optional } 
     ); 
    } 

Ho installato Phil Haack's RouteDebugger ed ho ottenuto il seguente risultato:

Screenshot

Quindi sembra corrispondere al controller e all'azione, ma ottengo solo un 404.

Per completezza e la garanzia, la mia struttura dei file "MVC" è anche mostrato:

enter image description here

che sto chiaramente manca qualcosa di ovvio, ma non è sicuro che cosa ...?


Aggiornamento:

Sembra miei spazi dei nomi sono coinvolti in qualche modo.

La mia classe TranslateAreaRegistration aveva lo spazio dei nomi Taggloo.Web.Client.Areas.Tradurre ma il mio PronunciationController aveva uno spazio dei nomi di * Taggloo.Web. ** MVC. ** * Client.Areas.Translate.Controllers

Sembra che un errore nel mio namespacing che ha causato i due di essere diversi (la TranslateAreRegistration classe dovrebbe essere nello spazio dei nomi Taggloo.Web.Mvc.Client.Areas.Translate). Ho provato a renderli entrambi Taggloo.Web.Mvc .... ma questo non ha funzionato. Ho impostato invadentemente entrambi su Taggloo.Web.Client ... e ora funziona.

Quindi non una soluzione, una soluzione, e nonostante ci si guardi attorno, non sono ancora il più saggio del perché.

+2

Ciao, Tutto ciò che si desidera è avere lo stesso spazio dei nomi su tutti i controller. Entrambi i controller si trovano in cartelle diverse, ad esempio Log ed Errore. Tutto sembra funzionare con me ad es. 'codice namespace Web.Controllers { classe LogController pubblico: controller { }} namespace Web.Controllers { classe ErrorController pubblico: controller { }} ' –

+0

Ah, grazie @NipunAmbastha . Sembra che abbia perso uno dei miei controllori. –

+0

Felice, posso aiutarti :) –

risposta

1

La registrazione dell'area predefinita in MVC (System.Web.Mcv.AreaRegistration.RegisterAllAreas) utilizza lo spazio dei nomi delle classi derivate di AreaRegistration dell'Area per aggiungere un token di dati Namespace alla definizione di route se si utilizza uno dei sovraccarichi di AreaRegistrationContext.MapRoute .

DefaultControllerFactory incrocia quindi lo spazio dei nomi di un controller durante la corrispondenza di un instradamento se questo token Namespaces è definito.

Se lo spazio dei nomi del controller è identico (o inizia con se il token dello spazio dei nomi termina con. *) Token, il factory corrisponderà al tipo di controller e procederà ad istanziare il controller. Se non corrisponde, ControllerFactory restituisce null dal metodo GetControllerType e alla fine otterrai un 404.

Hai detto che hai impostato entrambi su Taggloo.Web.Mvc .... Se fossero identici avrebbe dovuto funzionare .

+0

Sì, l'ho capito in tempo. Grazie. C'è così tanto da fare "sotto le copertine" in MVC a volte mi chiedo se la M sta per "Magic". Devi * conoscere * le convenzioni (oltre la configurazione) e le ragioni dietro. –