在 ASP.NET Core 3 MVC Web 应用程序中设置路由

Posted

技术标签:

【中文标题】在 ASP.NET Core 3 MVC Web 应用程序中设置路由【英文标题】:Setting up routes in ASP.NET Core 3 MVC web app 【发布时间】:2021-02-02 15:03:31 【问题描述】:

我有一个 ASP.NET Core 3 MVC Web 应用程序和几个控制器。

我正在尝试形成我的链接以访问这些控制器,但我不确定我做错了什么。

控制器名称:ExhibitorsDemoQueue

每个控制器都有一个 Index 动作,它接受 2 个 int 类型参数

public IActionResult Index(int eventId, int companyId)

这是我的相关@​​987654327@ 代码

app.UseEndpoints(endpoints =>

    endpoints.MapControllers();
    endpoints.MapControllerRoute("default", "controller=Home/action=Index/id?");
);

所以我的理解是,我可以通过这些 url 浏览到这 2 个操作:

Exhibitors/1/2
DemoQueue/3/4

但似乎我必须使用这个冗长的值:

Exhibitors/Index?eventId=1&companyId=2

有没有办法设置路线让我能够去[controller]/id/id?但是去一个不同的控制器,例如ExhibitorsDemoQueue

【问题讨论】:

您可以随时使用控制器/动作上的属性来自定义路由引擎,您不需要遵循 default 路由。 docs.microsoft.com/en-us/aspnet/core/fundamentals/… 我读到属性路由应该留给rest apis? 这就是你正在做的。 “Rest APIs”和“Websites”之间的唯一区别是网站大多使用 GET 动词并返回 html 而不是 json/xml。引擎盖下也是一样的。 【参考方案1】:

您没有定义自定义路由模板。在您的startup.cs 中,您所拥有的只是默认路由模板。

要将Exhibitors/1/2DemoQueue/3/4等请求映射到其对应的控制器Index方法,需要在默认的常规路由模板前添加以下内容:


app.UseEndpoints(endpoints =>

    endpoints.MapControllerRoute(
        name: "exhibitors-custom",
        pattern: "exhibitors/eventId:int/companyId:int",
        defaults: new  controller = "exhibitors", action = "index" 
    );

    endpoints.MapControllerRoute(
        name: "demoqueue-custom",
        pattern: "demoqueue/eventId:int/companyId:int",
        defaults: new  controller = "demoqueue", action = "index" 
    );

    endpoints.MapControllerRoute("default", "controller=Home/action=Index/id?");
);

混合路由

您可以混合使用传统路由和属性路由,但通常将传统路由用于为浏览器返回 HTML 的控制器,并为提供 RESTful API 的控制器使用属性路由。

参考:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.1#mixed-routing-attribute-routing-vs-conventional-routing

【讨论】:

完美。这帮助我弄清楚了如何设置一个端点是 /Report/001【参考方案2】:

您可以将代码更改为这些

public class ExhibitorsController:Controller
[Route("~/Exhibitors/eventId/companyId")]
public IActionResult Index (int eventId, int companyId)

and

public class DemoQueueController:Controller
[Route("~/DemoQueue/eventId/companyId")]
public IActionResult Index (int eventId, int companyId)

【讨论】:

以上是关于在 ASP.NET Core 3 MVC Web 应用程序中设置路由的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 3.0 MVC JSON 全局配置

asp.net core 3.1 MVC/WebApi JSON 全局配置

除日期时间外,每个字段都可以编辑。始终重置为默认值 - MVC ASP.NET Core 3.1 Web 应用

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

使用 ASP.NET Core MVC 创建 Web API

使用 ASP.NET Core MVC 创建 Web API