我正在使用 .NET 6(可能是 7)用 C# 构建一个类库,以便与 ASP.NET Core 站点一起使用。
我希望这个类库(除其他外)包含一个配置 UI(有点像 Swashbuckle 构建 OpenAPI UI - 我检查了源代码,但无法完全理解该部分)。
我认为在类库中创建 Controller / View 是可行的方法。
Controller 自动工作(尽管我有点担心路由冲突——如果我的类库中有一个/foo/bar 路由,并且使用该库的项目也有一个/foo/bar 路由怎么办? )。
但是, View 似乎不会自动添加。我尝试过嵌入并遵循文件夹约定,但仍然收到错误:
An unhandled exception occurred while processing the request. InvalidOperationException: The view 'Index' was not found. The following locations were searched: /Views/Foo/Index.cshtml /Views/Shared/Index.cshtml
这是类库的相关部分:
我需要做什么才能从类库加载/解析/工作这些 View ? (或者有没有更好的替代方法来完成我在没有 View 的情况下尝试做的事情?)
最佳答案
我按照前面的答案找到了它,并且引用的页面缺少使其工作的关键细节(将 View 标记为嵌入式资源,并且 View 似乎区分大小写):
研究步骤:
克隆了 Microsoft Sample app this page 中提到
运行 WebAppParts 示例 (.Net core 3.0) - 已工作
将 WebAppParts 示例更新为 .Net 6.0 - 已工作
创建了一个全新的 .Net 6 Web 应用程序
添加了 MySharedApp .Net 6 库
将代码片段添加到程序主设置中并调用它而不是
AddControllersWithViews
public static void ConfigureServices(IServiceCollection services) { var assembly = typeof(MySharedController).Assembly; services.AddControllersWithViews() .AddApplicationPart(assembly) .AddRazorRuntimeCompilation(); services.Configure<MvcRazorRuntimeCompilationOptions>(options => { options.FileProviders.Add(new EmbeddedFileProvider(assembly)); }); }
在 _Layout.cshtml 中添加了指向
MyShared/index
的菜单超链接 - 找不到 View将示例项目与我的新项目进行比较,并慢慢迁移设置/更改。
已将
Microsoft.Extensions.FileProviders.Embedded
NuGet 添加到库中。发现任何共享 View 都需要在 View
构建操作
中标记为嵌入资源
。这在示例应用程序中并不明显,因为 View 在示例应用程序中显示为Content
,尽管 .csproj 中有此条目
<ItemGroup>
<EmbeddedResource Include="Views\MyShared\Index.cshtml" />
</ItemGroup>
完成所有这些更改后,我的 .Net 6.0 测试 Web 应用程序开始共享库的 View 和 Controller 。
下面的最后一个示例是我将应用代码减少到
Program.Main()
中的内容。如果不需要,请随意删除 Auth 或 Json 行:var assembly = typeof(AnySharedController).Assembly; builder.Services.AddRazorPages() .AddJsonOptions(x => x.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull) .AddApplicationPart(assembly) .AddRazorRuntimeCompilation() .AddMicrosoftIdentityUI(); builder.Services.Configure<MvcRazorRuntimeCompilationOptions>(options => { options.FileProviders.Add(new EmbeddedFileProvider(assembly)); });
在将 View 迁移到库时,我发现除非 View 或部分 View 名称大小写相同,否则找不到部分 View 。
例如这次失败了
@(await Html.PartialAsync("titlepartial"))
然后这个就成功了
@(await Html.PartialAsync("TitlePartial"))
关于c# - 从类库添加 ASP.NET Controller / View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75051789/