C#3.5 MVC2路由跳过可选参数

C#3.5 MVC2路由跳过可选参数,c#,asp.net-mvc-2,routing,C#,Asp.net Mvc 2,Routing,我有: routes.MapRoute( "test", // Route name "DataWarehouse/Distribution/{category}/{serialNo}", new { controller = "DataWarehouse", action = "Distribution", category= UrlParameter.Optional, serialNo = UrlPa

我有:

routes.MapRoute(
    "test", // Route name
    "DataWarehouse/Distribution/{category}/{serialNo}",
    new { controller = "DataWarehouse", 
          action = "Distribution", 
          category= UrlParameter.Optional, 
          serialNo = UrlParameter.Optional } 
);
Category和serialNo都是可选参数。当路由类似于:
DataWarehouse/Distribution/123
时,它总是将123作为category的值

我的问题是如何知道第一个参数可以是category或serialNo,即
DataWarehouse/Distribution/{category}
DataWarehouse/Distribution/{serialNo}

DataWarehouse/Distribution/{category}/{serialNo}

只有最后一个参数可以是可选的。在本例中,由于明显的原因,类别不能是可选的。

如果您知道参数的外观,您可以添加一个选项来区分这两条路线

例如,如果您的序列号为1234-1234-1234,并且您的类别与此不同:

routes.MapRoute(
    "serialonly", // Route name
    "DataWarehouse/Distribution/{serialNo}",
    new { controller = "DataWarehouse", 
          action = "Distribution", 
          category= UrlParameter.Optional, 
          serialNo = UrlParameter.Optional },
    new{serialNo = @"\d{4}-\d{4}-\d{4}"} 
);

routes.MapRoute(
    "test", // Route name
    "DataWarehouse/Distribution/{category}/{serialNo}",
    new { controller = "DataWarehouse", 
          action = "Distribution", 
          category= UrlParameter.Optional, 
          serialNo = UrlParameter.Optional },
    ,
    new{serialNo = @"\d{4}-\d{4}-\d{4}"}  
);

我有一个类似的问题,我试图根据数据(
{year}/{month}/{day}
)进行路由,其中
可以是可选的。我发现我不能用一条路线来做这件事。所以我用3条路线解决了这个问题,从一般到具体(年、年、月、年、月、日)。我并不完全满意它,但它确实有效

因此,如果您正在寻找
DataWarehouse/Distribution/{category}
DataWarehouse/Distribution/{category}/{serialNo}
路由,我认为这将适合您