代码之家  ›  专栏  ›  技术社区  ›  giorgian

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

  •  1
  • giorgian  · 技术社区  · 15 年前

    我想要一个包含两个可选参数的路由;我认为以下内容可以工作:

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

    但这两种情况下都有效 vendor_id category_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是否正常,也就是说,您是否会建议一种更好的方法来执行此操作?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Hannoun Yassir    15 年前

    为什么不给供应商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" });
    
        2
  •  0
  •   davethecoder    15 年前

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

    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}
    

    但那只是我

        3
  •  0
  •   Mark    15 年前

    你可以这样试试:

    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" });
    

    然后您将在actionResult方法中创建一些逻辑来检查arg1和arg2,并标识传入的wich参数。

    您的actionLink URL如下所示:

    /products/create/vendor/10
    /products/create/category/20
    /products/create/vendor/10/category/20
    /products/create/category/20/vendor/10
    

    就我个人而言,我不喜欢这样,因为路线看起来不太干净,但应该给你我认为你希望达到的目标吗?