【问题标题】:ASP.NET MVC: Multiple View Folders and _ViewStart.cshtml fileASP.NET MVC:多个视图文件夹和 _ViewStart.cshtml 文件
【发布时间】:2013-02-23 08:06:45
【问题描述】:

我有一个 MVC 项目,需要有 2 个不同的 View 文件夹。一个在~/Views/,一个在~/Framework/Views/。这是通过创建一个基于 razor 视图引擎的自定义视图引擎来完成的,如下所示:

public class MyViewEngine : RazorViewEngine
{
    private static string[] AdditionalViewLocations = new[]{
        "~/Framework/Views/{1}/{0}.cshtml",
        "~/Framework/Views/{1}/{0}.vbhtml",
        "~/Framework/Views/Shared/{0}.cshtml",
        "~/Framework/Views/Shared/{0}.vbhtml"
    };

    public MyViewEngine()            
    {
        base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(AdditionalViewLocations).ToArray();
        base.ViewLocationFormats = base.ViewLocationFormats.Union(AdditionalViewLocations).ToArray();
        base.MasterLocationFormats = base.MasterLocationFormats.Union(AdditionalViewLocations).ToArray();
    }
}

问题是我想在 2 个 Views 文件夹中的每个文件夹中使用不同的 _ViewStart.cshtml 文件(即 ~/Views/_ViewStart.cshtml 用于在 ~/Views/ 文件夹中找到的视图,~/Framework/Views/_ViewStart.cshtml 用于在 ~/Framework/Views/ 中找到的视图文件夹),但是视图引擎只使用它找到的第一个,它是 ~/Views/ 中的原始文件夹。

这样可以吗?

谢谢

【问题讨论】:

  • 为什么不使用区域而不是使用视图引擎?
  • 这绝对是可能的 - 事实上,我只是使用您提供的视图引擎在我的机器上将它搅打起来,只是复制和粘贴。我没有看到与您相同的行为。我有两个 _ViewStart 文件,一个在 ~/Framework/Views/_ViewStart.cshtml,一个在 ~/Views/_ViewStart.cshtml。当我在 ~/Framework/Views/ 中运行视图时,它使用 Framework _ViewStart。当我在 ~/Views/ 中运行视图时,它使用 _ViewStart 那里。使用 DotPeek 仔细检查 RazorViewEngine 中的代码也确认这是它应该的行为方式。你确定你没有遗漏什么吗?
  • @NickAceves:谢谢你是对的。我的文件保存在错误的位置,并且错误文件的副本保存在正确的位置!真是个混蛋!再次感谢。 (把它放在答案中,我会标记它)

标签: asp.net-mvc asp.net-mvc-3 razor viewengine


【解决方案1】:

这绝对是可能的,我想你只是错过了一些东西。

我已经使用您提供的视图引擎(逐字复制和粘贴)自己对此进行了测试。我没有看到与您相同的行为。我有两个_ViewStart.cshtml 文件,一个在~/Framework/Views/_ViewStart.cshtml,一个在~/Views/_ViewStart.cshtml

当我在 ~/Framework/Views/ 中运行视图时,它使用 Framework 文件夹中的 _ViewStart.cshtml。当我在 ~/Views/ 中运行视图时,它使用 Views 文件夹中的 _ViewStart.cshtml

使用 DotPeek 对RazorViewEngine 中的代码进行双重检查也可以确认这正是它的行为方式。视图引擎开始在与正在呈现的视图相同的文件夹中检入名为 _ViewStart.cshtml 的文件,然后沿着目录树向上遍历,直到到达应用程序的根目录。

【讨论】:

    【解决方案2】:

    _ViewStart 的选择是分层的,但您已将 ~/Framework/Views 添加到 ~/Views 并行。我不认为 Razor 设置为实际执行您想要的操作(即两个完全平行的视图位置)。不过,如果您将Framework 放入主Views 文件夹,您的_ViewStarts 将正确加载。

    【讨论】:

    • 我明白了。框架目录也应该是这样的:~/Views/Framework/_ViewStart.cshtml~/Views/Framework/Controller/Action.cshtml。然后仍然需要自定义剃须刀视图引擎,但将 AdditionalViewLocations 更改为如下所示:"~/Views/Framework/{1}/{0}.cshtml"?
    • 还是平行视图位置?我应该将框架文件夹添加为一个区域吗? (之前没有使用过区域,如果我误解了,请见谅)
    • 不,这正是我要说的。如果您将所有“框架”视图放在一个文件夹中并在该文件夹中放置 _ViewStart,那么它将适用于该级别及以下的所有内容。把它想象成一个覆盖。您将不再需要自定义剃须刀引擎。
    • 对于区域,这也是一种完全可以接受的方法。区域有自己的Views 文件夹,但它们仍会查看主Views 文件夹。所以你可以有一个“框架”区域,并在~/Areas/Framework/Views 文件夹中放置一个_ViewStart
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多