【问题标题】:Routing between ASP.NET Core web application and Razor Class Library projectsASP.NET Core Web 应用程序和 Razor 类库项目之间的路由
【发布时间】:2020-09-18 06:32:39
【问题描述】:

我创建了一个项目 ASP.NET Core 3.0 MVC,它运行良好。在同一个解决方案中,我添加了 3 个(或更多)项目“Razor 类库”。每个这样的项目都有一个控制器。如何配置路由以便我可以访问这些项目的控制器方法?

我的解决方案如下所示:

MyProject.Shop (Razor Class Library)
|_ Controllers
    |_ HomeController.cs
MyProject.Books (Razor Class Library)
|_ Controllers
    |_ HomeController.cs
MyProject.Web (main ASP.NET Core 3.0 MVC project)
|_ Controllers
    |_ HomeControlles.cs

目前,路由只能在一个主要项目中完美运行。您无法访问 Myproject.Book 等中的控制器。也许您需要配置应用程序部件,但在我的情况下我该怎么做?

app.UseEndpoints(endpoints =>
{
  endpoints.MapControllerRoute(
    name: "areas",
    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  endpoints.MapDefaultControllerRoute();
});

【问题讨论】:

  • 你是否也在标签中指定了区域?

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


【解决方案1】:

为了使每个库都能正常工作,您需要做一些事情,所以让我们以您的 Shop 库为例,逐一介绍,这是针对 ASP.NET Core 3.1 的。

Web 项目中添加对 Razor 类库的引用

右键单击Web 项目的Dependencies 文件夹,选择Add Project Reference...,选中Shop 旁边的框,然后单击OK

确保您的控制器和视图文件夹位于 Areas/AreaName/ 文件夹下

在您的情况下,这意味着您的控制器和视图应位于 Areas/Shop 文件夹下,如下所示:

AreaAttribute 装饰库中的控制器

对于您的Shop 项目,这意味着为您的Shop 项目的HomeController 类执行以下操作:

[Area("shop")]
public class HomeController : Controller

_ViewStart.cshtml 复制到您的Shop 项目中

从您的Web 项目中,将Views/_ViewStart.cshtml 复制到您的Shop 项目的Areas/Shop/Views 文件夹中。它应该是这样的:

这样您的布局在您的 WebShop 项目之间是一致的。

在您的 Web 项目中更新您的路由配置以包含该区域的路由

在此示例中,路由在您的 Web 项目的 Startup.cs 中配置,如下所示:

app.UseEndpoints(endpoints =>
{
    endpoints.MapAreaControllerRoute(
        name: "shop-default", 
        areaName: "shop", 
        pattern: "shop/{controller=Home}/{action=Index}/{id?}");
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

现在,启动您的应用程序并转到默认 URL 应该会显示正常的主页,但导航到 /shop 会显示您在 Views/Shop/Index.cshtml 视图中的所有内容。

通过上面的操作,我看到了主页:

还可以导航到商店:

...我显然很饿,想要冰淇淋。

当然,您需要为您的 Books 库执行相同的过程。

【讨论】:

    【解决方案2】:

    整个解决方案的结构如下:

    Razor 类库

    配置

    <Project Sdk="Microsoft.NET.Sdk.Razor">
    
      <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
      </PropertyGroup>
    
    
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Components" Version="3.1.6" />
        <PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="3.1.6" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0" />
      </ItemGroup>
    
    </Project>
    

    控制者代码

    using Microsoft.AspNetCore.Mvc;
    
    namespace MyProject.Controllers
    {
        [Area("books")]
        public class HomeController : Controller
        {
            public string Index()
            {
                return "Books Home Index";
            }
        }
    }
    

    主 MVC 项目

    ASP.NET Core 3.0 MVC项目中Startup.cs的代码

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                  name: "areas",
                  pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
                endpoints.MapDefaultControllerRoute();
            });
    

    添加Project Reference...

    测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2017-08-15
      • 2021-02-24
      相关资源
      最近更新 更多