Mvc 的 ASP.NET 路由集成:Controller/Action-to-Route-Resolution

Mvc's ASP.NET Routing integration: Controller/Action-to-Route-Resolution

看看这条路线:

RouteTable.Routes.MapRoute(
   name: "FancyCustomerRoute",
   url: "fancy",
   defaults: new { controller = "SomeController", action = "Index", foo = "fancy" }
);

SomeController.Index 通常被写成 /Some/Index?foo=something,但对于喜欢的客户来说,这条路线只是 /fancy

通过 MVC 的反向路由匹配,我预计会得到 /Some/Index?foo=mundane 调用 Url.Action("Index", "Some", new { foo = "mundane" }) 但只有 /fancy 调用 Url.Action("Index", "Some", new { foo = "fancy" }).

到目前为止,一切都很好。

但是,我正在寻找一种方法来配置当 foo 参数 缺失 FancyCustomerRoute 路由也不被采用的路由而不是 不同:

Url.Action("Index", "Some") 目前也给了我 \fancy,我觉得这是不受欢迎的。

解决这个问题的最佳方法是什么?

我正在使用 MVC5。

干脆写自己的Routeclass作为路由器使用,像这样:

public class MyFancyRoute : Route
{
    public MyFancyRoute()
        : base("fancy", new MvcRouteHandler())
    {
        Defaults = new RouteValueDictionary { { "controller", "Some" }, 
        { "action", "Index" }, { "foo", "fancy" } };
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, 
        RouteValueDictionary values)
    {
        return values.ContainsKey("foo")
            ? base.GetVirtualPath(requestContext, values)
            : null;
    }
}

然后在 RouteConfig 中写下这个而不是你的:

RouteTable.Routes.Add(new MyFancyRoute());