MVC 将视图组件文件放在哪里

Eti*_*and 2 .net c# asp.net-mvc razor asp.net-core

关于项目结构的问题。到目前为止,我的 .NET Core 应用程序中有 3 个 ViewComponent。

在有关视图组件的 Microsoft 页面中,它们使用命名空间 ViewComponentSample.ViewComponents,但实际上,引擎在以下位置搜索视图组件

  • /Pages/Components/ProductBox/Default.cshtml
  • /Pages/Shared/Components/ProductBox/Default.cshtml
  • /Views/Shared/Components/ProductBox/Default.cshtml

这意味着:在 Pages/Views/Models 旁边创建 ViewComponents 文件夹将不起作用,因为它找不到它们。

这意味着我将它们放在页面/共享中,对吗?虽然部分视图以“_”开头,但我应该将其保留给 ViewComponents 吗?

目前我已将其放在 Pages\Shared\ProductBox 中,视图位于 Pages\Shared\Components\ProductBox\Default 中。

然后还有 2 个问题。模型的命名空间和位置。

此 ProductBox 应该位于命名空间 MyWebsite.Pages.Shared 中,还是位于命名空间 MyWebsite.ViewComponents 中?

至于模型,我应该将其放在 Models 文件夹中还是视图组件旁边,因为它的代码与其直接相关?我不喜欢将组件分散到 3 个文件夹中(ViewComponent、Components\ProductBox 和 Models)。那里有 ProductBox 确实感觉有点奇怪,但它就像页面旁边有模型一样。

对于与视图组件关联的模型,到目前为止,我有 3 个组件使用完全不同的模型。

  • LatestArticlesViewComponent:将 RssItem 类定义为子类,并返回它们的列表。
  • CoachingFormViewComponent:模型派生自 PageModel,ViewComponent 除了将页面的模型传递给视图之外什么也不做。
  • ProductBoxViewComponent:模型是由具有显示属性的ViewComponent发起的POCO类。

(起初我将 ViewComponent 类作为视图的模型传递,但这是一种代码味道,所以我将其更改为使用单独的模型类)

我做对了吗?我已经取得了进步,但想确保我走在正确的轨道上。

Chr*_*att 5

坦率地说,这些都不重要。你可以把任何东西放在任何你想要的地方。按照惯例,组件的视图应该放在 中{Views,Pages}/Shared/Components。路径的Views/Pages部分仅取决于您使用的是 Razor Pages 还是 MVC 视图,即使如此,也只是为了让您不需要额外的文件夹。对于 Razor Pages,默认情况下没有Views文件夹,同样对于 MVC,默认情况下也没有Pages文件夹。但是,您可以在同一项目中同时使用 Razor Pages 和 MVC,因此理论上可以同时拥有这两个目录。在这种情况下,放置组件的位置完全取决于判断。然而,除此之外,您可以更改这些约定或直接引用组件中的视图。无论哪种情况,组件视图都可以放在您选择的任何位置。这完全取决于你。

实际的视图组件本身大致相同。惯例是将它们放在文件夹 call 中ViewComponents,但这完全是可选的。ASP.NET Core 通过反射将它们引入,因此实际位置和命名空间并不重要。命名空间更加无形,因为它们在这里根本不重要。您可以遵循文件所在位置的约定,或者完全使用其他内容。