ASP.NET 属性路由和默认路由可以一起工作吗?

我有一个用 NET Core 2.1 编写的项目,其中有一堆带有属性路由的控制器/操作。就像是:


[Route("~/test")]

public class ProductsController : Controller

{

    [HttpGet("{id:int}")]

    public IActionResult ById(int id)

    {

        ...

    }

}

在启动时,我只是默认值:


app.UseMvc(routeBuilder =>

{

    routeBuilder.MapRoute(

        name: "default",

        template: "{controller=Home}/{action=Index}/{id?}");

});

因此,应用程序正在/test/42按预期解析,但无法/products/byid?id=42正常工作......如果我只是从控制器中注释掉属性,则会发生默认路由。


有没有办法让他们一起工作?


largeQ
浏览 201回答 2
2回答

天涯尽头无女友

您可以在同一应用程序中同时使用属性路由和常规路由。但是,一旦您使用属性路由标记控制器或操作,就无法使用传统路由路由到该控制器或操作。您仍然可以将常规路由用于其他控制器。如果您希望属性路由使用 /products 那么您可以更改它:[Route("~/products")]public class ProductsController : Controller{    [HttpGet("{id:int}")]    public IActionResult ById(int id)    {        ...    }}但是您不能对同一个控制器/操作使用两种类型的路由我所知道的唯一解决方法是您可以创建另一个控制器,该控制器从具有属性路由的控制器继承(使操作方法虚拟)。然后,您可以使用新的子类控制器取消属性路由,您可以使用常规路由路由到它,只需调用基类操作方法。例子:namespace MyNamespace{    public class ProductsController : Controller    {        [HttpGet("{id:int}")]        public virtual IActionResult ById(int id)        {            ...        }    }}namespace MyOtherNamespace{    public class ProductsController : MyNamespace.ProductsController    {        public override IActionResult ById(int id)        {            base.ById(id);        }    }}现在您可以使用常规路由路由到 ProductsController,而基本控制器使用属性路由。
打开App,查看更多内容
随时随地看视频慕课网APP