【问题标题】:Cross area ViewComponents跨区域视图组件
【发布时间】:2015-12-23 15:10:26
【问题描述】:

我有一个 ViewComponent 存储在一个名为“Dashboard”的区域中,但现在我想在另一个名为“Appplications”的区域中使用这个 ViewComponent。是的,我可以将它添加到根视图/共享文件夹,但我正在努力通过强大的区域使用来制作一个非常模块化的应用程序。

ASP.NET 5 RC1 MVC 6 似乎不支持对其他组件的跨区域引用。

如何添加其他视图位置?我需要补充: /Areas/Dashboard/Views/Shared/Components/DashboardMenu/Default.cshtml 作为视图渲染器的搜索位置

InvalidOperationException: The view 'Components/DashboardMenu/Default' was not found. The following locations were searched:
/Areas/Applications/Views/Application/Components/DashboardMenu/Default.cshtml
/Areas/Applications/Views/Shared/Components/DashboardMenu/Default.cshtml
/Views/Shared/Components/DashboardMenu/Default.cshtml.

【问题讨论】:

  • 如果它是一个通用组件并且在您的应用程序中被多个地方使用,您不应该将它移动到根目录下的 Shared 文件夹吗?
  • 那不是“过河”吗?我的意思是......区域旨在隔离您的应用程序的一部分。你为什么要“分离”它们?
  • 加上...@Shyju 所说的。
  • 我有一个区域专门用于提供这些常见的基本和一致的依赖项。跨区域依赖性将保持在最低限度,但源将始终从该单个区域提供。除了这个单一区域之外,提供的其他区域将没有交叉依赖关系。一个区域用于模板和样式,另一个区域用于核心内容,然后其他区域由这两者提供,这些区域可能会被交换以提供相同的功能。就像把汽车的方向盘换成粉红色的毛皮轮子一样 :-) 我的其他领域将是安全、应用程序、CMS 等。
  • 我的目标是坚持你们都建议的精神,除了这个可能是作为基础的两个领域。

标签: c# asp.net-core asp.net-core-viewcomponent


【解决方案1】:

解决了...

Startup.cs

// Add additional razor view engine configuration to facilitate:
// 1. Cross area view path searches
services.Configure<RazorViewEngineOptions>(options =>
{
    options.ViewLocationExpanders.Add(new RazorViewLocationExpander());
});

然后创建一个名为 RazorViewLocationExpander.cs 的类

using Microsoft.AspNet.Mvc.Razor;
using System.Collections.Generic;
using System.Linq;

public class RazorViewLocationExpander : IViewLocationExpander
{
    public void PopulateValues(ViewLocationExpanderContext context) { }

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
    {
        List<string> locations = viewLocations.ToList();

        locations.Add("/Areas/dashboard/Views/Shared/{0}.cshtml");

        return locations;
    }
}

我一般不会推荐这个。我将此解决方案用作特例,因为我正在使用一个区域来隔离模板和核心代码,以供我的其他(仅限成员)区域使用——因此他们需要知道在哪里可以找到此共享代码。我试图将公共代码与管理代码分开,这是我能想到的最干净、最模块化的解决方案。所有需要会员专享管理区域的网站都将显示仪表板区域。它稍微改变了 MVC 的规则。

【讨论】:

  • 我会补充一些智慧的话......“这不是因为你可以,你应该”。这绝对是 hacky 的地狱,它是不可发现的,参与这个项目会让我感到畏缩。
  • 我欢迎您的 cmets,因为我认为 MVC 有不同的模块化方法。该网站的主要内容应仅保留在公共内容区域,因此我的目标之一是清晰。根 IMO 应该仅供公众使用。我在这里尽量避免污染两组源代码。这让我有两个选择——使用区域或创建一个单独的网站。由于我选择了一个网站(出于效率、维护、成本原因),我被吸引到区域。对于要与其他领域共享的领域的观点,这是我必须采取的行动。哈基 - 只是一点点。
  • 我也非常注意这可能导致的并发症/头痛,因此我谨慎行事。例如。在控制器具有相同名称的索引的两个区域中查找可能是......一个问题。
  • 也许您可以创建一个完全不同的位置,而不是通过区域部分(特别是如果它仅用于视图)。这将防止区域和实际根视图之间的混淆。没有?
  • 取决于您所说的完全不同的位置是什么意思?仍然必须遵循 MVC 的约定,这意味着除了管理之外还有公共的东西。我试图将一个区域用于不同的位置,从而提供我所寻求的隔离。只需要在这里稍微调整一下,那里再稍微调整一下...... :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多