【问题标题】:Multiple Views Folder C# ASP MVC4多视图文件夹 C# ASP MVC4
【发布时间】:2013-11-15 01:32:16
【问题描述】:

我正在使用 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));
    }
  }

【问题讨论】:

  • 真正的问题是什么?你想知道如何让id 动态化吗?
  • 我想我可以得到它。主要问题是如何在视图之间切换。如果我将我的 id 更改为“2”(动态或非动态),我希望引擎在子文件夹 2 等中查找视图。
  • 你调试过你的代码吗?您的代码是否命中FileExists 方法?如果没有,那么您的CustomViewEngine 根本没有被使用。
  • 我什至在使用任何东西之前就已经 404 了……即使我正在尝试 @alex-v-kostyukov 的基本功能,方法是将正确的路径返回到我的视图(并停用那个自定义引擎)
  • 然后让我们看看您在Global.asax 文件和路线注册部分中有什么。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我粘贴的代码主要来自解决方案 1 中的代码示例,因此无法正常工作。第二个是基本的,但有效,我正在尝试检查除此之外的另一种方式(但如果需要,我会这样做)
  • 您的解决方案有问题,因为第一种方法是 Microsoft 推荐的。它不适用于所有示例或仅适用于您的项目?您是否在下载的解决方案示例中尝试过?
  • 嗯,很好的答案,我使用旧版本的解决方案再次尝试了 1 和 2,并且成功了。我不知道 404 是从哪里来的
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多