我在global.asax中定义了两个路由,如下面的
context.MapRoute("HomeRedirect", "",
new
{
controller = "Home",
action = "redirect"
});
context.MapRoute("UrlResolver", "{culture}/some",
new
{
culture = "en-gb",
controller = "someController",
action = "someAction"
},
new
{
culture = new CultureRouteConstraint()
});
根据上面的定义,当用户请求调用HomeController的mysite.com/ redirect操作时,应该调用:
public class HomeController : Controller
{
public ActionResult Redirect()
{
return RedirectToRoute("UrlResolver");
}
}
我想将用户重定向到上面的第二个定义的路由,所以我也为此指定了默认值,并为每个路由器指定了一些约束。但是当RedirectToRoute("UrlResolver")
转动时,没有默认值传递给第二条路线上的routeConstraints,No route in the route table matches the supplied values
显示。
更新
my CultureRouteConstraint:
public class CultureRouteConstraint : IRouteConstraint
{
bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
try
{
var parameter = values[parameterName] as string;
return (someCondition(parameter));
}
catch
{
return false;
}
}
}
现在值参数没有文化键/值,但路由参数有。
答案 0 :(得分:1)
HomeController.Redirect()的实现似乎没有添加任何附加值,那么为什么要包含名为“HomeRedirect”的路由呢?
如何删除它并让名为“UrlResolver”的路由处理请求。您可以根据需要配置默认值。
您可以在“UrlResolver”路线下添加“全部捕获”路线,以捕捉CultureRouteConstraint()与给定网址不匹配的情况。
答案 1 :(得分:1)
为您的第二条规则指定的实际路径是“{culture} / some”,因此您的重定向必须是,例如,“/ EN-us / some”而不是规则的名称。