多视图文件夹C#ASP MVC4

多视图文件夹C#ASP MVC4,c#,asp.net,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在使用Razor引擎渲染我的视图,我想对其进行一些自定义,以获得与默认视图不同的行为 对于相同的数据,我有不同的视图,我想重用它们,但我要在外部指定子文件夹的更改 这是一棵树: 观点 一, 控制器名称 Files.cshtml 共享 _Layout.cshtml 二, 控制器名称 Files.cshtml 共享 _OtherLayout.cshtml 等等 唯一不同的是子文件夹,其他所有内容都是相同的(除了cshtml文件的内容^^)。如何根据我的好意切换到正

我正在使用Razor引擎渲染我的视图,我想对其进行一些自定义,以获得与默认视图不同的行为

对于相同的数据,我有不同的视图,我想重用它们,但我要在外部指定子文件夹的更改

这是一棵树:

  • 观点
    • 一,
      • 控制器名称
        • Files.cshtml
      • 共享
        • _Layout.cshtml
    • 二,
      • 控制器名称
        • Files.cshtml
      • 共享
        • _OtherLayout.cshtml
    • 等等
唯一不同的是子文件夹,其他所有内容都是相同的(除了cshtml文件的内容^^)。如何根据我的好意切换到正确的文件夹

我的第一个方法(不是很成功)是创建一个CustomViewEngine(然后在Global.asax中调用它),但现在我得到了404。(稍后将设置id,ViewBag将是动态的)


有三种方法可以做到这一点:

  • 有一种方法可以通过一个好的代码示例来实现这一点。您的所有参数都通过了
    VirtualPathProviderViewEngine.cs

  • 您可以在控制器操作中轻松使用视图路径:
    返回视图(“~/stack/en/owerflow.cshtml”)

  • 您可以获取您的参数,并与前面的技术结合起来执行以下操作:
    returnview(RouteData.Values[“id”]+“/stackowerflow.cshtml”)


  • 真正的问题是什么?您想知道如何使
    id
    动态化吗?我想我可以得到它。主要问题是如何在视图之间切换。如果我将id更改为“2”(动态或非动态),我希望引擎在子文件夹2中查找视图。您是否调试了代码?您的代码是否命中
    FileExists
    方法?如果没有,那么您的
    CustomViewEngine
    就根本不用了。我甚至在使用任何东西之前都在使用404'ing。。。即使在我尝试@alex-v-kostyukov的基本功能时,通过返回到我的视图的正确路径(并取消激活该自定义引擎),让我们看看您的
    Global.asax
    文件和路由注册部分中有什么内容。我粘贴的代码主要来自解决方案1中的代码示例,因此不起作用。第二种方法是基本的,但很有效,我正在尝试检查除此之外的其他方法(但如果需要的话,我会去检查),因为第一种方法是微软推荐的。它不是在所有样本中都有效,还是仅仅在您的项目中有效?你们在下载的解决方案示例中试用过吗?很好,答案很好。我使用我的解决方案的旧版本再次尝试了1和2,结果成功了。我不知道404是从哪里来的
    public class CustomViewEngine : RazorViewEngine
      {
        public CustomViewEngine()
        {
          ViewLocationFormats = new[]
     {
     "~/Views/%1//{1}/{0}.cshtml",
     "~/Views/%1//Shared/{0}.cshtml"
     };
          MasterLocationFormats = new[]
     {
     "~/Views/%1/{1}/{0}.cshtml",
     "~/Views/%1/Shared/{0}.cshtml",
     };
          PartialViewLocationFormats = new[]
     {
    "~/Views/%1/{1}/{0}.cshtml",
    "~/Views/%1/Shared/{0}.cshtml"
     };
        }
    
        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
          var id = "1";
    
          return base.CreatePartialView(controllerContext, partialPath.Replace("%1", id));
        }
    
        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
          var id = "1";
    
          return base.CreateView(controllerContext, viewPath.Replace("%1", id), masterPath.Replace("%1", id));
        }
    
        protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
        {
          var id = "1";
    
          return base.FileExists(controllerContext, virtualPath.Replace("%1", id));
        }
      }