2010-04-21 16 views
13

Quando si esegue il MVC 2 Areas example che ha un area blog e Blog controller l'URL assomiglia a questo:Aree MVC ASP.NET: come nascondere il nome "Area" nell'URL?

http://localhost:50526/Blog/Blog/ShowRecent nel formato:

RootURL/AreaName/NomeControllore/ActionName

Avendo appena scoperto Aree MVC, sembra un ottimo modo per organizzare il codice, ovvero creare un'area per ogni sezione, che nel mio caso ogni sezione ha il proprio controller. Ciò significa che ogni AreaName = ControllerName. L'effetto di questo è il percorso doppia AreaName/NomeControllore nell'URL esempio /Blog/Blog/ sopra

Non avendo una chiara comprensione completa di routing, come potrei configurazione di routing di non mostrare l'AreaName?

EDIT:

Sto cercando di ridurre la quantità di lavoro con percorsi come questi sembrano effettuare ogni altra (cioè richiedono ordinamento specifico) e possono causare gravi mal di testa :-) Nella conversione di un app modulo web esistente a MVC, ho convertito un paio di sezioni principali, queste hanno un controller ciascuna e una buona quantità di vista/azioni e sebbene la maggior parte dell'accesso ai dati sia il codice è in assembly il numero di classi Model/ViewData sta crescendo ... I sto attualmente creando sottocartelle nelle cartelle Root Models/Views per queste sezioni (o Aree) e speravo che la creazione di Aree funzionasse allo stesso modo eccetto che il codice fosse organizzato (con l'uso di un percorso base che copre l'Area) Qualche commento su questo?

+1

Per curiosità, se non vuoi la cartella in più, perché implementare la tua applicazione in questo modo? – GalacticCowboy

+1

Btw .. Non esagerare con i percorsi .. Se crei un'area che avrà un unico controller, sei sicuro di aver bisogno di un'area separata in primo luogo? :) –

+0

@GalacticCowboy, Artiom: buoni punti e hanno aggiunto altri commenti sopra ... Potrebbe sembrare che le aree potrebbero non essere la strada da percorrere, o in effetti qualcosa da utilizzare quando avremo bisogno di iniziare a organizzare sezioni più grandi/specifiche. –

risposta

18

All'interno della cartella di ciascuna area viene visualizzato il file *AreaName*AreaRegistration.cs. È qui che sono archiviate le regole di indirizzamento dell'area. Per impostazione predefinita, man mano che vengono generati, conterranno il nome dell'area prima di tutto il resto. Il problema è: se si rimuove il nome area "cartella" dal percorso, il percorso prenderà tutto "standard" {controller}/{ azione}/{id} richieste. Che ovviamente non è quello che vuoi ..

Per superare questo è possibile aggiungere i filtri regex sui percorsi, in base ai nomi dei controller presenti in quella rotta. Lo svantaggio? Non sarà possibile avere due controller con lo stesso nome nell'app (almeno non utilizzando la route standard .. Puoi sempre pensare ad un percorso diverso per accedervi :))

Alla fine .. Avere questa struttura:

/Aree
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs

Che cosa si dovrebbe avere è sth come questo: In BlogAreaRegistration.cs:

context.MapRoute(
    "Blog_default", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    new { controller = "(Blog|Feed)" } 
); 

In UserAreaRegistration.cs:

context.MapRoute(
    "User_default", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    new { controller = "(User)" } 
); 

In Global.asax.cs:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    context.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 
protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterRoutes(RouteTable.Routes); 
} 

Si noti che nelle registrazioni di area global.asax vengono prima! :)

UPD: Sulla base l'aggiornamento domanda: Ci siamo una cosa importante che si dovrà prendere in considerazione se si utilizzerà aree: Se si dispone di un collegamento inter-area, ti Devo anche fornire il nome dell'area nel link. Per esempio.

<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %> 

Si ottiene l'idea.

Per quanto riguarda i modelli multipli/viste, al momento mi sto seguendo una struttura come questa

/Codice/// aiutante, classi di estensione che non sono spostati alle librerie
/Modelli/dati/// le classi EF + classi di validazione sono qui modelli
/modelle/ViewModels/{Controller}/// vista memorizzati per controller

Finora funziona bene, e sono riuscito a mantenere la soluzione relativamente organizzata . Come ho detto, l'unica area che ho creato finora è l'area Admin perché è che molto diverso dal resto del sito :)

+0

Grazie per quello! Avrò bisogno di giocare con questo (e un buon pensiero) per vedere quale beneficio si ottiene usando Aree nella situazione attuale ... –

+1

Solo per darti la mia situazione attuale: sto lavorando al mio motore di blog (probabilmente non pubblico, scritto solo per me stesso). Al momento la maggior parte dei controller si trova nella cartella predefinita/controller. Pagine, registrazione/autenticazione, commenti, download di file ecc. Ma ho creato un'area di amministrazione perché penso che dovrebbe essere separata dal codice normale + ha un aspetto diverso (cartella Contect separata, ecc.). Alla fine tocca a te) –

+0

Aggiunto un aggiornamento alla risposta, rispondendo al tuo aggiornamento alla domanda .. Umm .. che suonava strano: D –

1

Proprio per rispondere alla tua domanda iniziale, nel caso in cui qualcun altro sta leggendo questo:

Non nominare il blog del controller [predefinito]. Questo è il motivo per cui ottieni blog/blog {area/controller}. Puoi dare un nome completamente diverso: ad esempio, blog/view, blog/posts, blog/recenti, ecc. O, come predefinito, home. in questo caso, se si hanno anche a casa i controller di out-of-zona, ti consigliamo di namespace il controller di default:

routes.MapRoute("Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional}, 
    new[] { *appname*.Controllers" }); 

Questo farà sì che "/" e "/ blog" andare al appropriato controller "home". Se cerchi l'errore del controller principale duplicato, troverai di più su questo.

Problemi correlati