【问题标题】:Setting up routes in ASP.NET Core 3 MVC web app在 ASP.NET Core 3 MVC Web 应用程序中设置路由
【发布时间】: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。引擎盖下也是一样的。

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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多