2013-02-22 61 views
2

我正在爲我的cms(myprettycms.codeplex.com)定製FriendlyURL分析器。 該系統是多語種:高級自定義多語言網址處理/角色及成員LoginUrl

如果您在文件中查找:

https://myprettycms.codeplex.com/SourceControl/changeset/view/19148#457568

它的基類的2個控制器。一個是公開的,另一個是私人的。 2代碼之間的區別是私有的授權裝飾。

登錄網址取決於您嘗試訪問的網頁的語言。

如果我的英文頁面上一樣:

http://www.mydomain.com/en-us/products/priduct_list.htm

,如果這個頁面是私人(控制器設置爲DynaContentPrivateController),如果我沒有通過驗證,系統將重定向我請求web.config中定義的LoginURL

在這個時候,它被設置爲「~/logon

我會像「~/{0}/logon」,知道在代碼中的女巫一部分,我可以重寫代碼與語言的頁面我的更換{0}正在尋找

你能幫我嗎?

回答

2

我找到了解決辦法...

我一直在web.config中設置:

<authentication mode="Forms"> 
    <forms loginUrl="~/LogOn" timeout="2880" /> 
</authentication> 

Web.Config in codeplex

在RouteConfig.cs

routes.MapRoute(
    name: "LogOn", 
    url: "LogOn/{action}", 
    defaults: new { controller = "LogOn", action = "SelectLanguage" } 
); 

而在語言在RouteConfig中路由循環。CS

foreach (var l in Languages) 
{ 
    ... 
    routes.MapRoute(
    name: "LogOn" + l.Name.ToUpper(), 
    url: l.Description + "/logon/{action}", 
    defaults: new { controller = "LogOn", action = "Index", language = l.Description } 
    ); 
    ... 
} 

The routeconfig.cs in codeplex

在控制器基

public string URLReferLanguage 
{ 
    get 
    { 
     string toReturn = ConfigurationManager.AppSettings["DefaultLanguage"]; 
     string language = string.Empty; 
     string[] tLanguages = ConfigurationManager.AppSettings["Languages"].Split(','); 
     string urlReferrer = HttpContext.Request.UrlReferrer.AbsolutePath; 
     if (urlReferrer != null) 
     { 
      if (urlReferrer.Length > 5) 
      { 
       language = urlReferrer.Substring(1, 5).ToLower(); 
       if (tLanguages.Contains(language)) 
       { 
        toReturn = language; 
       } 
      } 
     } 
     return toReturn; 
    } 
} 

_Controller_Base in codeplex

在登錄控制器在安全層

public ActionResult SelectLanguage() 
{ 
    return Redirect(string.Format("/{0}{1}", base.URLReferLanguage, Request.Url.PathAndQuery)); 
} 

/// <summary> 
/// URL: /en-us/LogOn 
/// </summary> 
/// <returns></returns> 
public ActionResult Index() 
{ 
    string eMethod = eMethodBase + ".Index[GET]"; 
    using (DataRepositories _dataContext = new DataRepositories()) 
    { 
     base.InitView(
      Resources.View_LogOn_PageTitle, 
      string.Empty, 
      specificCssCollection, 
      specificJSCollection, 
      dynamicJSCollection, 
      specificJqueryJSCollection, 
      jsVariables, 
      externalCSS, 
      Meta, 
      _dataContext, 
      false, 
      base.RequestLanguage, 
      false 
     ); 
    } 
    string returnUrl = Request.QueryString["ReturnUrl"]; 
    if (!string.IsNullOrEmpty(returnUrl)) 
    { 
     ContentData.ReturnUrl = returnUrl; 
    } 
    return View(ContentData); 
} 

The LogOn controller in codeplex

因此,當用戶通過標準的作用和成員(我的供應商繼承標準之一)重定向到LoginForm的,控制器分析UrlRefer和添加的語言來處理,並重定向到它。