Domanda

Sono in procinto di creare un'applicazione ASP.NET MVC con l'ultima versione beta e mi chiedo se sia possibile modificare il layout predefinito del progetto di

/Views/Home/Index.aspx /Views/Home/About.aspx

a

/Blog/Views/Home/Index.aspx /Blog/Views/Home/About.aspx

/Forum/Views/Home/Index.aspx /Forum/Views/Home/About.aspx

L'obiettivo è quello di ottenere una certa separazione tra "applicazioni" all'interno di un singolo progetto Web, qualcosa come Thomas Owens ha già chiesto qui: In un framework MVC, quale struttura di directory si aspetterebbe da altri sviluppatori?

Ovviamente questo dovrebbe includere anche i controller, non solo le visualizzazioni.

È stato utile?

Soluzione

Questo non è un nuovo concetto. Si chiama " aree " in Monorotaia . Ci sono stati molti buzz su questo argomento recentemente sul forum ATL.NET e altrove. Steve Sanderson ha ideato un modo per farlo ma a quanto pare lascia alcuni problemi. A quanto pare, il team MVC apparentemente farà un " deep look " per una versione futura.

Altri suggerimenti

Sì, dovrebbe essere possibile farlo. Mi viene in mente un modo; potrebbero essercene altri.

Il primo passo è modificare il percorso predefinito per includere il nome dell'applicazione:

routes.MapRoute("Default",
                "{applicationName}/{controller}/{action}/{id})",
                null, null);

Presumo che stai per raggruppare le due "applicazioni" in spazi dei nomi diversi all'interno di un singolo assembly. Quindi potresti avere due spazi dei nomi come:

  • MyApp.Blog.Controllers
  • MyApp.Forum.Controllers

Successivamente, è necessario modificare la fabbrica del controller in modo che crei un'istanza del controller corretto. Puoi farlo sottotipando DefaultControllerFactory e sovrascrivendo il metodo GetControllerType:

    protected override System.Type GetControllerType(string controllerName)
    {
        string applicationName;
        if (RequestContext != null && 
           RequestContext.RouteData.Values.TryGetValue(
           "applicationName", out applicationName)) {
           // return controller type using app name to 
           // look up namespace and controllerName argument
           return ...
        }

        // if no match, maybe it's a different controller/route
        return base.GetControllerType(controllerName);
    }

Infine, devi dire a MVC di usare ControllerFactory. In Global.asax.cs:

    private void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.SetControllerFactory(
            MyApp.MyControllerFactory());
    }

Le viste di localizzazione possono essere gestite in modo simile. In questo caso, sottotipo WebFormViewEngine.

Ho appena scritto un post sul blog che descrive un approccio al raggruppamento dei controller simile a "aree" in monorotaia. Tuttavia non si occupa ancora di aree nidificate.

http://haacked.com/archive/2008 /11/04/areas-in-aspnetmvc.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top