Asp.net mvc 带有可选参数的ASP.NET MVC自定义路由

Asp.net mvc 带有可选参数的ASP.NET MVC自定义路由,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我想要一条有两个可选参数的路线;我认为以下方法可行: routes.MapRoute( "ProductForm", "products/{action}/{vendor_id}_{category_id}", new { controller = "Products", action = "Index", vendor_id = "", category_id = "" }, new { action = @"Create|Edit" } ); 但它仅在同时提

我想要一条有两个可选参数的路线;我认为以下方法可行:

routes.MapRoute(
    "ProductForm",
    "products/{action}/{vendor_id}_{category_id}",
    new { controller = "Products", action = "Index", vendor_id = "", category_id = "" },
    new { action = @"Create|Edit" }
);
但它仅在同时提供了
vendor\u id
category\u id
时起作用;使用
RouteDebug
我发现
/products/create/_3
不会触发我的路由,所以我添加了另外两个路由:

routes.MapRoute(
    "ProductForm1",
    "{controller}/{action}/_{category_id}",
    new { controller = "Home", action = "Index", category_id = "" },
    new { controller = "Products", action = @"Create|Edit" }
);

routes.MapRoute(
    "ProductForm2",
    "{controller}/{action}/{vendor_id}_",
    new { controller = "Home", action = "Index", vendor_id = "" },
    new { controller = "Products", action = @"Create|Edit" }
);
因此,问题是:

  • 使用三条路由是使用可选参数创建路由的唯一方法吗

  • 这些URL是否正常,也就是说,您是否会建议一种更好的方法


    • 我觉得不错,但我会做一些不同的事情:

      routes.MapRoute(
      "ProductForm1",
      "product/category/{category_id}",
      new { controller = "Home", action = "Index", category_id = "" },
      new { controller = "Products", action = @"Create|Edit" }
      
      ))

      然后

       routes.MapRoute(
      "ProductForm1",
      "product/details/{product_id}",
      new { controller = "Home", action = "Index", product_id = "" },
      new { controller = "Products", action = @"Create|Edit" }
      
      ))

      那么您的课程可以如下所示:

      ActionResults Index(){}
      ActionResults Index(int category_id){// get categories}
      ActionResults Index(int product_id){ // get products}
      

      但那只是我

      看起来不错,但我会做一些不同的事情:

      routes.MapRoute(
      "ProductForm1",
      "product/category/{category_id}",
      new { controller = "Home", action = "Index", category_id = "" },
      new { controller = "Products", action = @"Create|Edit" }
      
      ))

      然后

       routes.MapRoute(
      "ProductForm1",
      "product/details/{product_id}",
      new { controller = "Home", action = "Index", product_id = "" },
      new { controller = "Products", action = @"Create|Edit" }
      
      ))

      那么您的课程可以如下所示:

      ActionResults Index(){}
      ActionResults Index(int category_id){// get categories}
      ActionResults Index(int product_id){ // get products}
      

      但这只是我的问题,为什么不尝试为供应商id提供一个默认值(如果没有指定,即0),以帮助您避开一条路线

      routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
      new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },   
      new { action = @"Create|Edit" });
      

      为什么不尝试为vendor_id提供一个默认值(如果未指定,即0),以帮助您避开一条路线

      routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
      new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },   
      new { action = @"Create|Edit" });
      

      您可以这样尝试:

      routes.MapRoute(    
      "ProductForm",
      "products/{action}/{arg1}/{arg1_id}/{arg2}/{arg2_id}",    
      new { controller = "Products", action = "Index", arg1 = "", arg2 = "", arg1_id = "", arg2_id = "" },
      new { action = @"Create|Edit" });
      
      /products/create/vendor/10
      /products/create/category/20
      /products/create/vendor/10/category/20
      /products/create/category/20/vendor/10
      
      然后在actionresult方法中创建一些逻辑来检查arg1和arg2,并确定传入了哪个参数

      您的actionlink URL如下所示:

      routes.MapRoute(    
      "ProductForm",
      "products/{action}/{arg1}/{arg1_id}/{arg2}/{arg2_id}",    
      new { controller = "Products", action = "Index", arg1 = "", arg2 = "", arg1_id = "", arg2_id = "" },
      new { action = @"Create|Edit" });
      
      /products/create/vendor/10
      /products/create/category/20
      /products/create/vendor/10/category/20
      /products/create/category/20/vendor/10
      

      就我个人而言,我不喜欢这条路线,因为这条路线看起来不太干净,但应该能给你我认为你想要实现的目标?

      你可以这样尝试:

      routes.MapRoute(    
      "ProductForm",
      "products/{action}/{arg1}/{arg1_id}/{arg2}/{arg2_id}",    
      new { controller = "Products", action = "Index", arg1 = "", arg2 = "", arg1_id = "", arg2_id = "" },
      new { action = @"Create|Edit" });
      
      /products/create/vendor/10
      /products/create/category/20
      /products/create/vendor/10/category/20
      /products/create/category/20/vendor/10
      
      然后在actionresult方法中创建一些逻辑来检查arg1和arg2,并确定传入了哪个参数

      您的actionlink URL如下所示:

      routes.MapRoute(    
      "ProductForm",
      "products/{action}/{arg1}/{arg1_id}/{arg2}/{arg2_id}",    
      new { controller = "Products", action = "Index", arg1 = "", arg2 = "", arg1_id = "", arg2_id = "" },
      new { action = @"Create|Edit" });
      
      /products/create/vendor/10
      /products/create/category/20
      /products/create/vendor/10/category/20
      /products/create/category/20/vendor/10
      
      就我个人而言,我不喜欢这条路线,因为这条路线看起来不太干净,但应该给你我认为你想要实现的目标