用字符注册路由
本文关键字:路由 注册 字符 | 更新日期: 2023-09-27 17:53:57
我有2个方法的控制器,具有以下签名:
public class TestController
{
[HttpGet]
public ActionResult TestMethod1()
{
//here code
return Json(1, JsonRequestBehavior.AllowGet);
}
[HttpGet]
public ActionResult TestMethod2(long userId)
{
//here code
return Json("userId= " + userId, JsonRequestBehavior.AllowGet);
}
}
我想为这些方法创建以下路由器:
对于第一个方法:
http://domain/test/
对于第二个方法:
http://domain/test?userId={userId_value}
我尝试使用以下路由:
1。
context.MapRoute("route_with_value",
"test/{userId}",
new { controller = "test", action = "TestMethod2" });
context.MapRoute("route_no_value",
"test",
new { controller = "test", action = "TestMethod1" });
但这种方法对我不起作用
2。
context.MapRoute("route_with_value",
"test?userId={userId}",
new { controller = "test", action = "TestMethod2" });
context.MapRoute("route_no_value",
"test",
new { controller = "test", action = "TestMethod1" });
但是我得到错误:
路由URL不能以'/'或'~'字符开头,也不能包含'?'字符。
是否可以为我的url创建地图路由?
内置路由方法不知道查询字符串值。为了让它们知道,你需要构建自定义路由或约束。
在这种情况下,做一个简单的约束就可以了,因为你只想在查询字符串键存在时运行第一个路由。
public class QueryStringParameterConstraint : IRouteConstraint
{
private readonly string queryStringKeyName;
public QueryStringParameterConstraint(string queryStringKeyName)
{
if (string.IsNullOrEmpty(queryStringKeyName))
throw new ArgumentNullException("queryStringKeyName");
this.queryStringKeyName = queryStringKeyName;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest)
{
return httpContext.Request.QueryString.AllKeys.Contains(this.queryStringKeyName, StringComparer.OrdinalIgnoreCase);
}
return true;
}
}
使用context.MapRoute(
name: "route_with_value",
url: "test",
defaults: new { controller = "test", action = "TestMethod2" },
constraints: new { _ = new QueryStringParameterConstraint("userId") }
);
context.MapRoute(
name: "route_no_value",
url: "test",
defaults: new { controller = "test", action = "TestMethod1" }
);