通过路由约束

问题描述:

海兰传递数据,在我的Global.asax我有这样的规则:通过路由约束

// Home 
    routes.MapRoute("Home", 
        "{lang}/", 
        new { lang = "ita", controller = "Home", action = "Index" }, 
        new { lang = new LanguageRouteConstraint() } 
       ); 

而且我LanguageRouteConstraint类:

public class LanguageRouteConstraint : IRouteConstraint 
    { 
    #region Membri di IRouteConstraint 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if ((routeDirection == RouteDirection.IncomingRequest) && (parameterName.ToLower(CultureInfo.InvariantCulture) == "lang")) 
     { 
     try 
     { 
      string lang = Convert.ToString(values[parameterName]); 

      // Language check on db 
      Language currLang = new Language().Get(lang); 
      if (currLang != null) 
      { 
      // Here I'd like to "save (in session|querystring|....)" the id 
      return true; 
      } 
     } 
     catch 
     { 
      return false; 
     } 
     } 
     return false; 
    } 

    #endregion 
    } 

我的控制器

public class HomeController : Controller 
{ 
    public ActionResult Index(string lang) 
    { 
    // I would get the language ID without interrogating the data base 
    } 
} 

在HomeController - > Index方法中,我会在不询问数据库的情况下获得语言ID,因为我已经在LanguageRouteC onstraint。

对不起,我可怜的英语

在此先感谢。

你可以做到以下几点:

  • Match方法中,在RouteValueDictionary中插入语言ID:values["lang"] = theLanguageId;
  • 把你的行动的签名改成类似ActionResult Index(int lang)
+0

的最佳解决方案! +1 – 2010-03-16 15:21:04

你可以在你的语言约束通过HttpContext的访问当前会话

Language currLang = new Language().Get(lang); 
    if (currLang != null) 
    { 
    httpContext.Session["Lang"] = id 
    return true; 
    } 

然后在你的控制器,你可以使用属性

public int Language { get return int.Parse(Session["Lang"].ToString()); }