多视图文件夹C#ASP MVC4

时间:2013-11-14 15:34:17

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我正在使用Razor Engine来渲染我的视图,我想稍微自定义它以获得与默认行为不同的行为。

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

所以这是树:

    • 1
      • ControllerName
        • Files.cshtml
      • 共享
        • _Layout.cshtml
    • 2
      • ControllerName
        • Files.cshtml
      • 共享
        • _OtherLayout.cshtml

唯一不同的是子文件夹,其他一切都是相同的(除了cshtml文件的内容^^)。如何根据我的意愿切换到正确的文件夹?

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

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

1 个答案:

答案 0 :(得分:0)

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

  1. 有一种方法可以使用一个好的代码示例look here来完成此操作。您的所有参数都通过了VirtualPathProviderViewEngine.cs

  2. 您可以在控制器操作中轻松使用视图路径:return View("~/stack/en/owerflow.cshtml")

  3. 你可以获得你的参数并与之前的技术相结合:return View(RouteData.Values["id"]+"/stackowerflow.cshtml")