如何更改 .Views.dll 中预编译视图的默认命名并使用该名称通过控制器操作调用?
How can I change the default naming of a precompiled View in .Views.dll and use that name to call via Controller action?
我正在尝试使用 ASP.Net Core 2.2 和 MVC 构建模块化架构。本质上,我有一个基础 ASP.Net Core 2.2 网络应用程序。然后我想继续添加 class 库作为我的应用程序的功能。我通过配置 AreaViewLocationFormats 路由到这些功能。
我的 Class 库针对 SDK - Microsoft.NET.Sdk.Razor。在构建时我确实看到了 .Views.dll 并且我的基本应用程序能够扫描这些并添加到应用程序工厂。
在应用程序启动时,我正在扫描这些 class 库的 dll 和 Views.dll,然后像这样将它们添加到应用程序部分(我已经简化了这个以便我可以分享):
foreach (var file in plugInFolder.GetFileSystemInfos("*.dll", SearchOption.AllDirectories))
{
Assembly assembly;
try
{
assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(file.FullName);
}
catch (FileLoadException ex)
{
// If assembly is already loaded, we'll just catch it and continue to the next one, plugins can have same dependencies:
if (ex.Message == "Assembly with same name is already loaded")
{
continue;
}
throw;
}
//If its a View Assembly then we need to load it differently:
if (assembly.FullName.Contains(".Views"))
{
mvcBuilder.ConfigureApplicationPartManager(mgr => {
foreach (var b in CompiledRazorAssemblyApplicationPartFactory.GetDefaultApplicationParts(assembly))
{
mvcBuilder.ConfigureApplicationPartManager(apm => apm.ApplicationParts.Add(b));
}
});
}
// If plugin hasn't been loaded already
else if (!plugins.ContainsKey(pluginFolder.Name) && // plug in isn't loaded already and
pluginFolder.Name == assembly.GetName().Name) // plug in Name matches Folder Name {Our convention}
{
plugins.Add(pluginFolder.Name, new PlugInInfo { Name = pluginFolder.Name, Assembly = assembly, Path = pluginFolder.PhysicalPath });
//plugin load:
mvcBuilder.AddApplicationPart(assembly);
}
}
问题出在 Views.dll 上,因为它们具有以下奇怪的属性(通过 ILSpy 检查):
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: RazorCompiledItem(typeof(Views_Home_Index), "mvc.1.0.view", "/Views/Home/Index.cshtml")]
[assembly: RazorView("/Views/Home/Index.cshtml", typeof(Views_Home_Index))]
我认为由于上面编译中的“/Views/Home/Index.cshtml”,如果我使用
,我只能调用我的视图
return View("/Views/Home/Index.cshtml")
问题是 - 我不能对其他 class 库使用相同的 Views-Home-Index 命名。
现在,我可以在不预编译视图和使用 cshtml 文件的情况下解决问题。但我想利用预编译视图的优势。
我已经参考了 Razor SDK 的 MS 文档,但未能获得适当的帮助,或者我可能错过了一些东西。
我能做些什么来修复编译视图的这些名称吗?请指导。
我相信命名是根据 MVC 约定来自视图的位置,但我希望能够通过
调用我的视图
return View("<FeatureName>/Views/Home/Index.cshtml");
但目前它只适用于:
return View("Views/Home/Index.cshtml");
我联系了 aspnet 核心团队,得到了答复。如果您也被困在这里,请参考以下内容并对我的问题投赞成票:)
https://github.com/aspnet/AspNetCore/issues/7112
我正在尝试使用 ASP.Net Core 2.2 和 MVC 构建模块化架构。本质上,我有一个基础 ASP.Net Core 2.2 网络应用程序。然后我想继续添加 class 库作为我的应用程序的功能。我通过配置 AreaViewLocationFormats 路由到这些功能。 我的 Class 库针对 SDK - Microsoft.NET.Sdk.Razor。在构建时我确实看到了 .Views.dll 并且我的基本应用程序能够扫描这些并添加到应用程序工厂。
在应用程序启动时,我正在扫描这些 class 库的 dll 和 Views.dll,然后像这样将它们添加到应用程序部分(我已经简化了这个以便我可以分享):
foreach (var file in plugInFolder.GetFileSystemInfos("*.dll", SearchOption.AllDirectories))
{
Assembly assembly;
try
{
assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(file.FullName);
}
catch (FileLoadException ex)
{
// If assembly is already loaded, we'll just catch it and continue to the next one, plugins can have same dependencies:
if (ex.Message == "Assembly with same name is already loaded")
{
continue;
}
throw;
}
//If its a View Assembly then we need to load it differently:
if (assembly.FullName.Contains(".Views"))
{
mvcBuilder.ConfigureApplicationPartManager(mgr => {
foreach (var b in CompiledRazorAssemblyApplicationPartFactory.GetDefaultApplicationParts(assembly))
{
mvcBuilder.ConfigureApplicationPartManager(apm => apm.ApplicationParts.Add(b));
}
});
}
// If plugin hasn't been loaded already
else if (!plugins.ContainsKey(pluginFolder.Name) && // plug in isn't loaded already and
pluginFolder.Name == assembly.GetName().Name) // plug in Name matches Folder Name {Our convention}
{
plugins.Add(pluginFolder.Name, new PlugInInfo { Name = pluginFolder.Name, Assembly = assembly, Path = pluginFolder.PhysicalPath });
//plugin load:
mvcBuilder.AddApplicationPart(assembly);
}
}
问题出在 Views.dll 上,因为它们具有以下奇怪的属性(通过 ILSpy 检查):
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: RazorCompiledItem(typeof(Views_Home_Index), "mvc.1.0.view", "/Views/Home/Index.cshtml")]
[assembly: RazorView("/Views/Home/Index.cshtml", typeof(Views_Home_Index))]
我认为由于上面编译中的“/Views/Home/Index.cshtml”,如果我使用
,我只能调用我的视图return View("/Views/Home/Index.cshtml")
问题是 - 我不能对其他 class 库使用相同的 Views-Home-Index 命名。 现在,我可以在不预编译视图和使用 cshtml 文件的情况下解决问题。但我想利用预编译视图的优势。 我已经参考了 Razor SDK 的 MS 文档,但未能获得适当的帮助,或者我可能错过了一些东西。 我能做些什么来修复编译视图的这些名称吗?请指导。
我相信命名是根据 MVC 约定来自视图的位置,但我希望能够通过
调用我的视图return View("<FeatureName>/Views/Home/Index.cshtml");
但目前它只适用于:
return View("Views/Home/Index.cshtml");
我联系了 aspnet 核心团队,得到了答复。如果您也被困在这里,请参考以下内容并对我的问题投赞成票:) https://github.com/aspnet/AspNetCore/issues/7112