【问题标题】:How to change View & partial view default location如何更改视图和局部视图默认位置
【发布时间】:2013-10-06 18:57:18
【问题描述】:

我是 MVC 的新手,非常想知道如何更改视图和部分视图位置。

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

1)假设我的控制器名称是产品,但我想将相应的视图存储在 myproduct 文件夹中......指导我需要做什么才能使一切正常。

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

基本上我如何指示控制器从我的文件夹中加载视图和部分视图而不提及路径。寻找好的讨论。谢谢

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

如果您想为特定控制器提供特殊的视图位置,在您希望将 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());
}

【讨论】:

  • 谁能指出如何更改控制器的默认位置?如果可能的话,将我重定向到正确的文章以更改 asp.net mvc 控制器的默认位置。谢谢
  • @Mou 更改控制器默认位置是什么意思?它们通常位于 Controllers 文件夹中,但您可以随意移动它们。
【解决方案2】:

您可以在 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} 对应查看名称,您可以查看现有属性来确定。

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

【讨论】:

  • 谁能指出如何更改控制器的默认位置?如果可能,将我重定向到正确的文章以更改 asp.net mvc 控制器的默认位置。谢谢
  • @Mou 随时提出新问题。
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2010-10-28
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多