2010-02-26 12 views
14

Ho una grande applicazione esistente costruita su ASP.NET MVC2 RC2.Come specificare l'area predefinita senza aggiungere area = "" a ogni ActionLink

Tutti i miei link simile a questa: HTP // sito/regolatore/action/id

Ho appena aggiunto una zona chiamata: Bigbird.

Ora quando mi trovo in zona Bigbird, tutti i miei link simile a questa: htp: // sito/Bigbird/regolatore/action/id

Il problema è che nessuno di questi controllori/azioni esiste nella mia nuova area. Quindi devo passare attraverso tutti i miei link di azione tutta la mia applicazione e mettere questo routevalue: area = string.empty

C'è qualche modo per aggirare questo?

risposta

12

non so di via intorno ad esso se si utilizza i metodi standard (MVC diverse forse ignorando loro di chiamare il proprio versione), ma se si utilizza lo ActionLink<TController> o altri metodi generici forniti nella libreria MvcFutures, è possibile.

I metodi MvcFutures chiamano ExpressionHelper.GetRouteValuesFromExpression(), che cerca un ActionLinkAreaAttribute sul controller per determinare l'area. Così si può decorare i controller nella vostra "area" principale come segue:

[ActionLinkArea("")] 
[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

I collegamenti d'azione dovrebbero essere generati correttamente utilizzando la sintassi standard:

<%= Html.ActionLink<HomeController>(c => c.Index(), "Home") %> 
+0

Grazie per la risposta. Questo è esattamente ciò che ho fatto, ma non ho cercato di postarlo. – iamwill

+0

Haha qui stavo aggiungendo uno stupido Html.AreaActionLink ... poi ho visto il RouteValueDictionary GetRouteValuesFromExpression e mi chiedevo cosa fosse questo ActionLinkAreaAttribute! Google è arrivato qui e ottimo lavoro: P – superlogical

+0

Ciao, ma quando usiamo questo Attributo di Area - [ActionLinkArea ("")] e proviamo a usare Html.BuildUrlFromExpression (x => Index()) otteniamo ancora htp: // site/BigBird/controller/action/id area in URL ... –

0

Si può fare una delle due cose. Puoi spostare/copiare i tuoi controller/azioni nell'area appropriata o scrivere nuovi controller per la nuova area (che è l'approccio che raccomando), oppure puoi scrivere un percorso personalizzato che forza la nuova area alla radice (che io Sconsigliato, come si sconfigge l'intero scopo di avere aree):

routes.MapRoute(
    "BigBird_Override",            
    "BigBird/{controller}/{action}/{id}",       
    new { area = String.Empty } 
); 
+1

La mia spiegazione non era molto chiaro. Ho aggiunto i miei controller/modelli BigBird/viste all'area BigBird. Ma la masterpage che copre sia l'Area che il sito principale, mostra BigBird in tutti i link al sito principale. Quindi quello che sembra che devo fare è aggiungere {Area = ""} a tutte le mie chiamate ActionLink. Da quello che posso dire nella sorgente MVC è che deduce l'Area in base all'area in cui ci si trova. Non determina che un controller non si trova in un'area, e quindi aggiunge in modo errato BigBird ai collegamenti che non sono t nella BigBird Area ... non sono in nessuna Area. – iamwill

Problemi correlati