【问题标题】:Make a specific controller grab views from a subfolder使特定控制器从子文件夹中获取视图
【发布时间】:2013-10-15 12:09:19
【问题描述】:

假设我有一个名为 Foo 的控制器基类和一个名为 Bar 的控制器实例。

我需要 Bar 来搜索以下文件夹中的视图:

~\Views\Foo\Bar
~\Views\Foo\Shared
~\Views\Bar
~\Views\Shared

但我希望其他控制器和以前一样工作,即在以下位置查找视图:

~\Views\ControllerName
~\Views\Shared

是否可以在asp.net-mvc中实现?

解决方案不必足够聪明就能知道基控制器类名为 Foo。

【问题讨论】:

  • 您必须编写一个自定义视图引擎来实现这一点。
  • 阅读我关于创建视图引擎的帖子(您可以直接使用它,您只需为其定义一些约定)sapiensworks.com/blog/post/2013/04/18/…

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


【解决方案1】:

这是一种肮脏的方法,但您可以在基本控制器中尝试此方法 (Foo):

protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
    if (filterContext.Result is ViewResult)
    {
        foreach (var engine in ViewEngineCollection.OfType<VirtualPathProviderViewEngine>())
        {
            var newViewLocations = engine.FileExtensions.Select(ext => "~/Views/Foo/{1}/{0}." + ext).ToList();
            newViewLocations.AddRange(engine.ViewLocationFormats);
            engine.ViewLocationFormats = newViewLocations.ToArray();
        }
    }

    base.OnResultExecuting(filterContext);
}

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    if (filterContext.Result is ViewResult)
    {
        foreach (var engine in ViewEngineCollection.OfType<VirtualPathProviderViewEngine>())
        {
            var removeViewLocations = engine.FileExtensions.Select(ext => "~/Views/Foo/{1}/{0}." + ext).ToList();
            var removedLocations = engine.ViewLocationFormats.ToList();
            removedLocations.RemoveAll(x => removeViewLocations.Contains(x));
            engine.ViewLocationFormats = removedLocations.ToArray();
        }
    }

    base.OnResultExecuted(filterContext);
}

【讨论】:

  • 谢谢,这很好,但我有一个小问题。我从 ~/Views/Foo/ 加载了一个视图,它加载得很好。我从该视图内部加载了一个部分(也位于 ~/Views/Foo/),它也加载得很好。然后我尝试从该部分内部加载另一个部分,我收到一条错误消息,通知我找不到它(搜索目录列表不包括任何 ~/Views/Foo/ 目录)。不过,我仍然需要进行进一步的测试。
  • OnResultExecuted 方法的开头放置一个断点,看看它是否在你的部分渲染内部部分之前被调用。
  • 我把断点放在 OnResultExecuted 中,但它似乎没有在内部部分之前运行。它甚至似乎没有在第一个部分之前运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2016-03-05
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
相关资源
最近更新 更多