我需要有以下 C# MVC 调用,例如:

/SomeController/ActionOne/1/2/3
/SomeController/ActionTwo/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" }
);

Controller 看起来像这样:
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:
public ActionResult ActionOne ( int intId1, int intId2, int? intId3, string? string1 )
            { ... }
public ActionResult ActionTwo ( int intId1, int intId2, int? intId3, string? string1 )
            { ... }

最佳答案

我没有测试它,但你可以在你的 Action 的 Route 属性上使用约束。例如使用您的路由 url:
[Route("SomeController/{action}/{intId1}/{intId2}/{intId3:int}]
(使用 Route 属性,您也可以修改路由 url,从根本上解决您的问题,而无需担心约束)

this page 上你可以找到更多(它是关于 Web Api,但路由过程应该是相同的)。

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

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

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

关于c# - 两个具有不同数据类型的 MapRoute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45925967/

10-13 08:10