2013-10-06 92 views
6

我是MVC中的新成员,非常好奇,想知道如何才能更改视图&局部视图位置。如何更改视图和局部视图默认位置

我们知道该视图&部分视图存储在视图文件夹中。如果我的控制器名称为home,则视图必须存储在视图文件夹内的主文件夹和共享文件夹中的所有parial view store中。我想知道如何更改查看&部分视图默认位置?

1)假设我的控制器名称是产品,但我想将相应的视图存储在myproduct文件夹中.......指导我如何使所有工作正常。

2)我想将所有的局部视图存储在视图文件夹内的部分文件夹中,并希望从那里加载所有局部视图。所以引导我需要做什么才能使一切正常。

basicall如何指示控制器加载视图&从我的文件夹的部分视图,而不提及路径。寻找良好的讨论。谢谢

+0

有人告诉我写自己的视图引擎然后它将是可能的,但我猜没有写自定义视图引擎这可能是可能的。请帮助我的知识。感谢 – Mou

+0

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

回答

9

您可以在您的Global.asax启动代码中修改RazorViewEngineViewLocationFormatsPartialViewLocationFormats属性。围绕以下线的东西应该工作:

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}将对应到控制器和{0},查看名称,你可以看看现有的属性,以确保。

如果您想保留现有的搜索位置,您需要将它们复制到您的新阵列中。

+0

任何人都可以指出如何更改控制器的默认位置?如果可能的话,将我重定向到正确的文章,以改变asp.net mvc控制器的默认位置。谢谢 – Mou

+0

@你可以自由地将它作为一个新问题。 –

9

如果你想为特定的控制器特殊视图的位置,你的情况,你想ProductController的观点去myProduct的文件夹,你需要重写的RazorViewEngineFindViewFindPartialView方法:

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); 
    } 
} 

而且如果你也许要在前面加上“我”到每个控制器的看法文件夹,您的视图引擎应该是这样的

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(); 
    } 
} 

,比你的Global.asax

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

任何人都可以指出如何更改控制器的默认位置?如果可能的话,将我重定向到正确的文章,以改变asp.net mvc控制器的默认位置。谢谢 – Mou

+0

@你通过更改控制器的默认位置是什么意思?它们通常位于Controllers文件夹中,但您可以随意将它们移动到任意位置。 –