我想以一种对我来说有意义的方式来排列我的组件文件夹。问题是我一旦完成,ASP.NET找不到组件。仅当我将它们放在“共享/组件”或“视图/ {NameOfView} /组件”中时才能找到它们。有没有办法配置它?
答案 0 :(得分:1)
您可以将组件和视图放置在任意位置。
例如
我在Views
中创建了一个名为Info
的文件夹
然后我在该文件夹中创建一个名为Tested.cshtml
的视图
所以在我的主项目目录中,我有:
ProjectName > Views > Info > Tested.cshtml
然后我在主项目目录中创建了一个名为ViewComponents
的文件夹。
然后在该文件夹中创建了一个类-该名称不需要继承ViewComponent
,只要它继承了ViewComponent
并且具有IViewComponentResult Invoke()
为了使整个项目更加清晰,我在VC
后添加了ViewComponents。
所以现在我也有:
ProjectName > ViewComponents > TestingVC.cs
在该类的Invoke
方法中,我将其直接指向刚创建的ViewComponent
位置,确保使用~
到达主项目的根。
public class TestingVC : ViewComponent
{
public IViewComponentResult Invoke()
{
return View("~/Views/Info/Tested.cshtml");
}
}
然后,您只需在另一个视图中的任何地方调用ViewComponent类,就可以使用nameof
来避免魔术字符串:
@await Component.InvokeAsync(nameof(ProjectName.ViewComponents.TestingVC))
简单!
THere可能是一种在不使用魔术字符串的情况下获取cshtml
文件目录的方法,但是至少在此演示中,您基本上可以将ViewComponents
和Views
放在您喜欢的任何位置
答案 1 :(得分:0)
根据Microsoft Documentaiton:
运行时在以下路径中搜索View组件的视图:
/Pages/Components/{View Component Name}/{View Name}
/Views/{Controller Name}/Components/{View Component Name}/{View Name}
/Views/Shared/Components/{View Component Name}/{View Name}
视图组件的默认视图名称为
Default
,这意味着您的视图文件通常将命名为Default.cshtml
。创建视图组件结果或调用View方法时,可以指定其他视图名称。我们建议您命名视图文件
Default.cshtml
,并使用Views/Shared/Components/{View Component Name}/{View Name}
路径。
尽管运行时可以在上述三个路径中进行搜索,但是Microsoft建议在三个路径中使用以下路径:
/Views/Shared/Components/{View Component Name}/{View Name}
这很有意义!因为ViewComponent
实际上是共享视图,可用于从布局页面到任何单独页面的应用程序中的任何位置。因此,根据特性,应始终将其放置在“共享”文件夹中。
谢谢。
答案 2 :(得分:0)
尽管官方文档中没有提供有关如何自定义视图组件位置的描述,但是您仍然可以按照有关如何使用普通View文件进行操作的教程进行操作。
简而言之:
RazorViewEngineOptions
选项以告知Razor视图文件的位置Components/YourViewComponentName/
文件夹以告知Razor您的视图组件所在的位置。详细信息
假设您要创建一个视图组件,以呈现具有不同主题的不同视图文件:
public class MyViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync( string template, string theme)
{
template = string.IsNullOrEmpty(template) ? "Default": template;
theme = string.IsNullOrEmpty(theme) ? "" : "." +theme;
return View(template+theme);
}
}
您可以将此文件随意放置在任何地方。为了进行测试,我创建了一个文件夹,如下所示:
Your project folder/
App.csproj
MyLocations/
MyViewComponent.cs # MyViewComponent class
DefaultTheme/
Components/ # The name of `Components` here matters
My/ # Your ViewComponentName
Default.cshtml # view file of your view component
Another.cshtml # view file of your view component
Theme2/
Components/ # The name of `Components` here matters
My/ # Your ViewComponentName
Default.Theme2.cshtml # view file of your view component
Another.Theme2.cshtml # view file of your view component
Views/
Controllers/
请注意,文件夹名称My
应该与视图组件名称保持一致。如果您将名称自定义为Our
,则文件夹名称也应更改。
要使其正常运行,只需为RazorViewEngineOptions
添加一个配置:
services.Configure<RazorViewEngineOptions>(o =>{
o.ViewLocationFormats.Add("MyLocations/DefaultTheme/{0}" + RazorViewEngine.ViewExtension);
o.ViewLocationFormats.Add("MyLocations/Theme2/{0}" + RazorViewEngine.ViewExtension);
});
仅此而已。