问题
I created a project ASP.NET Core 3.0 MVC and it works fine. In the same solution, I added 3 (or more) projects "Razor Class Library". Each such project has a controller. How do I configure routing so that I can access the controller methods of these projects?
My solution looks like this:
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
Currently, routing works perfectly only within one main project. You can't access the controller in Myproject.Book etc. Maybe you need to configure Application Parts, but how do I do this in my case?
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapDefaultControllerRoute();
});
回答1:
There are a few things you need to do in order to make this work for each library, so let's go over each one, using your Shop
library as an example, and this is for ASP.NET Core 3.1.
Add a reference to your Razor class library from your Web
project
Right-click the Dependencies
folder of your Web
project, select Add Project Reference...
, check the box next to Shop
and click OK
.
Make sure your controllers and views folders are under an Areas/AreaName/
folder
In your case, this means your controllers and views should be under an Areas/Shop
folder, like this:
Decorate the controllers in your library with an AreaAttribute
For your Shop
project, this means doing the following for your Shop
project's HomeController
class:
[Area("shop")]
public class HomeController : Controller
Copy _ViewStart.cshtml
to your Shop
project
From your Web
project, copy Views/_ViewStart.cshtml
to your Shop
project's Areas/Shop/Views
folder. It should look like this:
This is so your layout is consistent between your Web
and Shop
projects.
Update your routing configuration in your Web
project to include routing for the area
In this example, the routes are configured in your Web
project's Startup.cs
like so:
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?}");
});
Now, launching your application and going to the default URL should show you the normal home page, but navigating to /shop
will show you whatever you have in your Views/Shop/Index.cshtml
view.
From doing the above, I see the home page:
and can also navigate to the shop:
...and I'm apparently hungry and wanting icecream.
Naturally, you'll need to go through the same kind of process for your Books
library.
回答2:
The structure of the whole solution is below:
Razor Class Library
Configuration
<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>
Codes of Controller
using Microsoft.AspNetCore.Mvc;
namespace MyProject.Controllers
{
[Area("books")]
public class HomeController : Controller
{
public string Index()
{
return "Books Home Index";
}
}
}
Main MVC project
Codes of Startup.cs in ASP.NET Core 3.0 MVC project
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapDefaultControllerRoute();
});
Add Project Reference...
Test
来源:https://stackoverflow.com/questions/63950436/routing-between-asp-net-core-web-application-and-razor-class-library-projects