C# 具有不同数据类型的两个MapRoutes

C# 具有不同数据类型的两个MapRoutes,c#,asp.net-mvc,C#,Asp.net Mvc,我需要进行以下C#MVC呼叫,例如: /SomeController/ActionOne/1/2/3 /SomeController/Action2/1/2/astring 这是我的路线图: routes.MapRoute ( name: "One", url: "SomeController/{action}/{intId1}/{intId2}/{intId3}", defaults: new {

我需要进行以下C#MVC呼叫,例如:

/SomeController/ActionOne/1/2/3
/SomeController/Action2/1/2/astring

这是我的路线图:

routes.MapRoute (
                name: "One",
                url: "SomeController/{action}/{intId1}/{intId2}/{intId3}",
                defaults: new { controller = "SomeController", action = "ActionOne" }
);

routes.MapRoute (
                name: "Two",
                url: "SomeController/{action}/{intId1}/{intId2}/{string1}",
                defaults: new { controller = "SomeController", action = "ActionTwo" }
);
控制器看起来像这样:

public ActionResult ActionOne ( int intId1, int intId2, int intId3 )
            { ... }
public ActionResult ActionTwo ( int intId1, int intId2, string string1 )
            { ... }
当我使用URL/SomeController/ActionTwo/1/2/astring时,这会产生参数字典包含参数的空条目

我希望避免仅为了绕过路由规则而传递未使用的参数,例如/SomeController/ActionTwo/1/2//astring:


我没有测试它,但是您可以在操作中使用
路由
属性上的约束。例如,您的路由url:

[路由(“SomeController/{action}/{intId1}/{intId2}/{intId3:int}]

(使用
Route
属性,您也可以修改路由url,基本上解决了您的问题,而无需考虑约束)

在上,您可以找到更多内容(关于WebAPI,但路由过程应该是相同的)

实际上,还有另一种方法可以设置路由url上的约束:在
MapRoute
中输入
constraints

routes.MapRoute(
name: "One",
url: "SomeController/{action}/{intId1}/{intId2}/{intId3}",
defaults: new { controller = "SomeController", action = "ActionOne" }
constraints: new{intId3=@"\d+"} 
);

您也可以使用正则表达式。

我对映射路由没有太多经验,但我猜这是因为路由本身对类型一无所知,MVC框架也不会尝试解析它们以选择正确的路由。您可以轻松解决这种不明确的情况,为第二个操作声明不同的路由。你可以这样做吗?@MarcoLuzzara我如何声明不同的路由?我不需要添加另一个参数来使模式不同吗?太棒了!谢谢Marco--这起作用了!对于那些稍后查看字符串arg的人,我使用了:constraints:new{string1=@.+“}其中.匹配任何字符。但该映射需要在整数(\d+)后面!
routes.MapRoute(
name: "One",
url: "SomeController/{action}/{intId1}/{intId2}/{intId3}",
defaults: new { controller = "SomeController", action = "ActionOne" }
constraints: new{intId3=@"\d+"} 
);