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。
干脆写自己的Route
class作为路由器使用,像这样:
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());
看看这条路线:
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。
干脆写自己的Route
class作为路由器使用,像这样:
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());