为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
largeQ 2021-09-19 18:58:20
我有一个用 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正常工作......如果我只是从控制器中注释掉属性,则会发生默认路由。有没有办法让他们一起工作?
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您可以在同一应用程序中同时使用属性路由和常规路由。但是,一旦您使用属性路由标记控制器或操作,就无法使用传统路由路由到该控制器或操作。您仍然可以将常规路由用于其他控制器。


如果您希望属性路由使用 /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,而基本控制器使用属性路由。


查看完整回答
反对 回复 2021-09-19
  • 2 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信