2010-06-09 13 views
9

Stiamo costruendo un sito che avrà un codice molto minimale, per lo più sarà solo un mucchio di pagine statiche pubblicate. So che nel tempo cambierà e vorremmo scambiare informazioni più dinamiche, quindi ho deciso di andare avanti e creare un'applicazione web utilizzando ASP.NET MVC2 e il motore di visualizzazione Spark. Ci saranno un paio di controller che dovranno svolgere il lavoro effettivo (come nell'area/prodotti), ma la maggior parte sarà statica.Viste ASP.NET MVC semplici senza scrivere un controller

Desidero che il mio designer sia in grado di creare e modificare il sito senza dover chiedere di scrivere un nuovo controller o percorso ogni volta che decidono di aggiungere o spostare una pagina. Quindi, se vuole aggiungere una pagina "http://example.com/News", può semplicemente creare una cartella "Notizie" sotto Viste e inserire una pagina index.spark al suo interno. Successivamente, se decide che desidera una pagina/News/Community, può rilasciare un file community.spark all'interno di quella cartella e farlo funzionare.

Sono in grado di avere una vista senza un'azione specifica facendo in modo che i miei controller sovrascrivano HandleUnknownAction, ma devo ancora creare un controller per ciascuna di queste cartelle. Sembra sciocco dover aggiungere un controller vuoto e ricompilare ogni volta che decidono di aggiungere un'area al sito.

C'è un modo per rendere tutto più semplice, quindi devo solo scrivere un controller e ricompilare se c'è una vera logica da fare? Una sorta di controller "master" che gestirà tutte le richieste in cui non è stato definito un controller specifico?

+0

+1 per aver menzionato HandleUnknownAction. Questo mi ha aiutato. –

risposta

6

Dovrai scrivere una route mapping per il controller/azioni effettive e assicurarti che il default abbia indice come azione e l'id sia "catchall" e questo lo farà!

+0

Questo ha funzionato perfettamente, grazie! –

1

Non è possibile creare un controller separato per tutte le pagine statiche e reindirizzare tutto (a parte i controller effettivi che funzionano) ad esso utilizzando MVC Routes e includere i parametri del percorso? Quindi in quel controller si potrebbe avere la logica per visualizzare la vista corretta in base al parametro cartella/percorso ad esso inviato dai percorsi.

Anche se non so che il motore di visualizzazione spark gestisce le cose, è necessario compilare le viste? Non sono davvero sicuro.

0

Penso che sia possibile creare il proprio controller factory che istanzia sempre la stessa classe controller.

1

Riflettere sulla risposta di Paolo. Non sto usando alcun motore di visualizzazione speciale, ma ecco cosa faccio:

1) Creare un PublicController.cs.

// GET: /Public/ 
[AllowAnonymous] 
public ActionResult Index(string name = "") 
{ 
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); 
    // check if view name requested is not found 
    if (result == null || result.View == null) 
    { 
     return new HttpNotFoundResult(); 
    } 
    // otherwise just return the view 
    return View(name); 
} 

2) quindi creare una directory pubblica nella cartella Visualizzazioni, e mettere tutti i vostri punti di vista lì che si desidera essere pubblico. Ne avevo personalmente bisogno perché non sapevo mai se il cliente voleva creare più pagine senza dover ricompilare il codice.

3) Quindi modificare RouteConfig.cs per reindirizzare all'azione Pubblico/Indice.

routes.MapRoute(
    name: "Public", 
    url: "{name}.cshtml", // your name will be the name of the view in the Public folder 
    defaults: new { controller = "Public", action = "Index" } 
); 

4) Poi basta fare riferimento a esso dal vostro punto di vista in questo modo:

<a href="@Url.RouteUrl("Public", new { name = "YourPublicPage" })">YourPublicPage</a> <!-- and this will point to Public/YourPublicPage.cshtml because of the routing we set up in step 3 --> 

Non so se questo sia migliore rispetto all'utilizzo di un modello di fabbrica, ma mi sembra il più facile da implementare e capire.

3

Questo link potrebbe essere di aiuto,

Se si crea cshtml in vista \ directory pubblica, essa appare sul sito Web con lo stesso nome. Ho aggiunto anche la pagina 404.

[HandleError] 
    public class PublicController : Controller 
    { 
     protected override void HandleUnknownAction(string actionName) 
     { 
      try 
      { 
       this.View(actionName).ExecuteResult(this.ControllerContext); 
      } 
      catch 
      { 
       this.View("404").ExecuteResult(this.ControllerContext); 
      } 
     } 
    } 
Problemi correlati