我正在为我的 cms (myprettycms.codeplex.com) 开发一个自定义的FriendlyURL 分析器。 该系统是多语言的:
- http://www.mydomain.com/en-us/friendly/url/friendly_url_page.htm
- http://www.mydomain.com/fr-fr/friendly/url/friendly_url_page.htm
如果你查看文件:
https://myprettycms.codeplex.com/SourceControl/changeset/view/19148#457568
它是 2 个 Controller 的基类。一个是公共(public)的,另一个是私有(private)的。 两段代码的区别在于私有(private)代码中的授权装饰。
登录 URL 取决于您尝试访问的页面的语言。
如果我在一个英文页面,例如:
http://www.mydomain.com/en-us/products/priduct_list.htm
如果此页面是私有(private)的( Controller 设置为 DynaContentPrivateController
),并且如果我未经过身份验证,系统会将我的请求重定向到中定义的 LoginURL
web.config
。
此时设置为“~/logon
”
我会有类似“~/{0}/logon
”的内容,并且知道我可以覆盖代码以替换 {0}
的代码部分我正在寻找的页面的语言。
你能帮我吗?
最佳答案
我找到了解决方案...
我保留了 web.config 设置:
<authentication mode="Forms">
<forms loginUrl="~/LogOn" timeout="2880" />
</authentication>
在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
在 Controller 底座中
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 中
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 时, Controller 会分析 UrlRefer 并添加语言来寻址并重定向到它。
关于c# - 高级自定义多语言 URL 处理/角色和成员资格 LoginUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15026488/