基于参数类型的MVC路由匹配

MVC Route match based on parameter type

我希望 ThisAction 控制器看起来像这样:

public ActionResult Index()...
public ActionResult Index(int programId)...
public ActionResult Index(string programKey)...

以这样设置路线为目标

www.website.com/ThisAction/ <- 匹配第一个函数
www.website.com/ThisAction/123 <- 匹配第二个函数
www.website.com/ThisAction/ABC <- 匹配第三个函数

是否可以在 global.asx 路由中设置?

您需要使用具有路由约束的属性路由才能轻松获得这种灵活性。

[RoutePrefix("ThisAction")]
public class ThisActionController : Controller {
    [HttpGet]
    [Route("")] //Matches GET ThisAction
    public ActionResult Index() {
        //...
    }
    [HttpGet]
    [Route("{programId:int}")] //Matches GET ThisAction/123
    public ActionResult Index(int programId) {
        //...
    }
    [HttpGet]
    [Route("{programKey}")] //Matches GET ThisAction/ABC
    public ActionResult Index(string programKey) {
        //...
    }    
}

确保在 RouteConfig

中启用属性路由
public class RouteConfig {
    public static void RegisterRoutes(RouteCollection routes) {
        //...other code removed for brevity

        //Attribute routes
        routes.MapMvcAttributeRoutes();

        //convention-based routes

        //...other code removed for brevity

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = "" }
        );
    }
}

该路由将与基于边约定的路由一起工作。

请注意,一旦在控制器上使用它,就必须在整个控制器上使用它。所以控制器要么全基于约定,要么全属性路由。