1

我正在使用 Razor 引擎来呈现我的视图,并且我想对其进行一些自定义以获得与默认行为不同的行为。

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

所以这是树:

  • 意见
    • 1
      • 控制器名称
        • 文件.cshtml
      • 共享
        • _Layout.cshtml
    • 2
      • 控制器名称
        • 文件.cshtml
      • 共享
        • _OtherLayout.cshtml
    • 等等

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

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

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

1 回答 1

0

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

  1. 有一个很好的代码示例可以做到这一点,看这里。你所有的参数都通过了VirtualPathProviderViewEngine.cs

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

  3. 您可以获取您的参数并结合以前的技术执行此操作:return View(RouteData.Values["id"]+"/stackowerflow.cshtml")

于 2013-11-14T15:49:52.307 回答