c# - 从类库添加 ASP.NET Controller / View

标签 c# asp.net-mvc asp.net-core razor

我正在使用 .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

这是类库的相关部分:

class library structure

我需要做什么才能从类库加载/解析/工作这些 View ? (或者有没有更好的替代方法来完成我在没有 View 的情况下尝试做的事情?)

最佳答案

我按照前面的答案找到了它,并且引用的页面缺少使其工作的关键细节(将 View 标记为嵌入式资源,并且 View 似乎区分大小写):

研究步骤:

  1. 克隆了 Microsoft Sample app this page 中提到

  2. 运行 WebAppParts 示例 (.Net core 3.0) - 已工作

  3. 将 WebAppParts 示例更新为 .Net 6.0 - 已工作

  4. 创建了一个全新的 .Net 6 Web 应用程序

  5. 添加了 MySharedApp .Net 6 库

  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)); });
    }
    
  7. 在 _Layout.cshtml 中添加了指向 MyShared/index 的菜单超链接 - 找不到 View

  8. 将示例项目与我的新项目进行比较,并慢慢迁移设置/更改。

  9. 已将 Microsoft.Extensions.FileProviders.Embedded NuGet 添加到库中。

  10. 发现任何共享 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/

    相关文章:

    c# - 从 Controller 传递模型中的 ICollection 时,Ajax 方法将不再起作用

    c# - 如何在命令行上更改连接字符串以在迁移到 Entity Framework Core 中的新数据库时更新数据库

    asp.net-mvc - 确定用户是否登录 MVC WEB API 的正确方法是什么?

    asp.net-mvc - 了解Global.asax中的路由(asp.net-mvc)

    asp.net-core - 默认 ASP.NET 核心项目无法发布

    c# - 为什么加载区域 Controller 时我的 BaseController.User 值 == null?

    C# 风格的问题,ctor 变量名和类属性名

    c# - 用另一个相关问题编辑了这个问题。请帮助 : Can I use the same variable names for several methods of a class?

    c# - 从 TCP 服务器向客户端发送多条消息(C sharp 到 Android)

    c# - 如何做到这一点 : i press 'G' on textbox and i'll see 'A' ?