2010-06-08 134 views
3

我根据上述定义,当用户请求重定向mysite.com/的HomeController的动作应被调用,并且在该定义中的global.asax两条路线如以下ASP.NET MVC路由缺省值

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

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

我想重定向用户对上述第二规定的路线,所以还我指定为和默认值的一些约束对于每个那些。但是当RedirectToRoute("UrlResolver")转向时,没有默认值传递给第二条路线上的routeConstraints,并显示No route in the route table matches the supplied values

更新

我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

你重新编译了你的应用程序吗?我使用我对问题的理解创建了一个示例应用程序,但无法复制您的错误。我相反​​得到了我的理解是您的预期结果(重定向到UrlResolver路由) – 2010-06-08 06:03:14

+0

是的,我重新编译;我的问题是,当我使用RedirectToRoute时,文化的第二个路线的默认值为空(RouteValueDictionary上没有路线键/值以检索CultureRouteConstraint上的值) – Sadegh 2010-06-08 06:17:42

回答

1

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

1

HomeController.Redirect()的实现似乎没有添加任何附加值,所以为什么包含名为“HomeRedirect”的路由呢?

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

您可能会在“UrlResolver”路径下添加一个“catch all”路由来捕获CultureRouteConstraint()与给定的URL不匹配的情况。