3

我在 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()
                            });

根据上面的定义,当用户请求 mysite.com/ 时 HomeController 的重定向动作应该被调用,其中:

public class HomeController : Controller
{
    public ActionResult Redirect()
    {
        return RedirectToRoute("UrlResolver");
    }
}

我想将用户重定向到上面第二个定义的路由,所以我也为它指定了默认值,并为每一个指定了一些约束。但是当RedirectToRoute("UrlResolver")转弯时,没有默认值传递给第二条路线上的 routeConstraints 并No route in the route table matches the supplied values显示。

更新

我的文化路线约束:

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;
        }
    }
}

现在值参数没有文化键/值,但路由参数有。

4

2 回答 2

1

HomeController.Redirect() 的实现似乎并没有增加任何额外的价值,那么为什么要包含名为“HomeRedirect”的路由呢?

如何删除它并让名为“UrlResolver”的路由处理请求。您可以根据需要配置默认值。

您可以在“UrlResolver”路由下方添加“全部捕获”路由,以捕获 CultureRouteConstraint() 与给定 URL 不匹配的情况。

于 2010-06-30T16:59:46.877 回答
1

为您的第二条规则指定的实际路线是“{culture}/some”,因此您的重定向必须是,例如,“/EN-us/some”而不是规则的名称。

于 2010-06-30T17:23:21.007 回答