2013-10-06 5 views
6

Ich bin neu in MVC und sehr neugierig ändern zu wissen, dass, wie könnte ich Ansicht & Teilansicht Lage ändern.Wie Ansehen und Teilansicht Standardposition

wissen wir, dass Ansicht & Teilansicht Speicher im Hinblick auf Ordner. Wenn der Name meines Controllers zu Hause ist, muss die Ansicht im Home-Ordner im Ansichtsordner und in der Parial-Ansicht im freigegebenen Ordner gespeichert werden. Ich möchte wissen, wie kann ich ändern View & Teilansicht Standard-Speicherort?

1) nehme mein Controller-Name Produkt ist, aber ich möchte die entsprechende Ansicht in MyProduct Ordner speichern ....... leite mich, was ich tun müssen, um alles funktioniert gut zu machen.

2) Ich möchte all meine Teilansicht in Teil Ordner Innenansicht Ordner speichern und will von dort aus aller Teilansicht laden. also führe mich, was ich tun muss, damit alles gut funktioniert.

basicall, wie ich Controller anweisen könnte Ansicht & Teilansicht von meinem Ordner zu laden, ohne Pfad zu erwähnen. auf der Suche nach einer guten Diskussion. danke

+0

jemand sagte mir, Sie sollten Ihre eigene View Engine schreiben, dann wird es möglich sein, aber ich denke, ohne benutzerdefinierte Ansicht Engine dies zu schreiben, kann dies möglich sein. Bitte helfen Sie mir mit Wissen. danke – Mou

+0

http://coding-in.net/mvc-3-organize-your-partial-views/ – Mou

Antwort

9

Sie können die Eigenschaften RazorViewEngineViewLocationFormats und PartialViewLocationFormats in Ihrem Global.asax-Startup-Code ändern. Etwas um die folgenden Zeilen sollten arbeiten:

protected void Application_Start(object obj, EventArgs e) 
{ 
    var engine = ViewEngines.Engines.OfType<RazorViewEngine>().Single(); 
    var newViewLocations = new string[] { 
     "~/SomeOtherFolder/{1}/{0}.cshtml", 
     "~/GlobalFolder/{0}.cshtml"  
    }; 
    engine.ViewLocationFormats = newViewLocations; 
    engine.PartialViewLocationFormats = newViewLocations; 
} 

IIRC, {1} entspräche und dem Controller {0} Namen anzuzeigen, können Sie auf bestehende Objekte sehen können sicher zu machen.

Wenn Sie Sie bestehende Suchpositionen halten wollen, müssen sie in Ihr neues Array kopieren.

+0

kann jemand darauf hinweisen, wie Controller Standard-Speicherort ändern? wenn möglich, leiten Sie mich zum richtigen Artikel um, um den Standardstandort von asp.net mvc controller zu ändern. danke – Mou

+0

@Mou zögern, es als eine neue Frage zu stellen. –

9

Wenn Sie eine spezielle Ansichten Standorte für spezifische Controller haben wollen, in Ihrem Fall, dass Sie Product Blick auf MyProduct Ordner gehen wollen, müssen Sie FindView und FindPartialView Methoden der RazorViewEngine außer Kraft zu setzen:

public class MyRazorViewEngine : RazorViewEngine 
{ 
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     if (controllerContext.Controller is ProductController) 
     { 
      string viewPath = "/Views/MyProduct/" + viewName + ".cshtml"; 
      return base.FindView(controllerContext, viewPath, masterName, useCache); 
     } 

     return base.FindView(controllerContext, viewName, masterName, useCache); 
    } 

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 
    { 
     if (controllerContext.Controller is ProductController) 
     { 
      string partialViewPath = "/Views/MyProduct/Partials/" + partialViewName + ".cshtml"; 
      return base.FindPartialView(controllerContext, partialViewPath, useCache); 
     } 

     return base.FindPartialView(controllerContext, partialViewName, useCache); 
    } 
} 

Und wenn Sie vielleicht voranstellen wollen „My“ zu jedem Controller Ansichten Ordner, sollten Sie Ihre Ansicht-Engine so aussehen

public class MyRazorViewEngine : RazorViewEngine 
{ 
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     string viewPath = "/Views/My" + GetControllerName(controllerContext) + "/" + viewName + ".cshtml"; 
     return base.FindView(controllerContext, viewPath, masterName, useCache); 
    } 

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 
    { 
     string partialViewPath = "/Views/My" + GetControllerName(controllerContext) + "/Partials/" + partialViewName + ".cshtml"; 
     return base.FindPartialView(controllerContext, partialViewPath, useCache); 
    } 

    private string GetControllerName(ControllerContext controllerContext) 
    { 
     return controllerContext.RouteData.Values["controller"].ToString(); 
    } 
} 

Und als in Ihrem Global.asax

protected void Application_Start() 
{ 
    //remove unused view engines, for performance reasons as well 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new MyRazorViewEngine()); 
} 
+0

kann jemand darauf hinweisen, wie Controller Standard-Speicherort ändern? wenn möglich, leiten Sie mich zum richtigen Artikel um, um den Standardstandort von asp.net mvc controller zu ändern. danke – Mou

+0

@Mou was meinst du mit dem Ändern der Standardposition des Controllers ?. Sie befinden sich normalerweise im Ordner "Controller", Sie können sie jedoch beliebig verschieben. –