c# - 高级自定义多语言 URL 处理/角色和成员资格 LoginUrl

标签 c# asp.net asp.net-mvc-4

我正在为我的 cms (myprettycms.codeplex.com) 开发一个自定义的FriendlyURL 分析器。 该系统是多语言的:

如果你查看文件:

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>

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

在 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_Base in codeplex

在安全层的登录 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/

相关文章:

c# - 如何以编程方式向现有 GridView 添加附加列?

c# - 编译器错误CS1061

C# 代码片段不会自动导入命名空间

razor - Razor MVC 4 RC中的空第一行

asp.net-mvc - 什么是 ASP.NET MVC 中的模型绑定(bind)?

c# - 这是在C#.NET a+++++ a中完美定义的吗?如果是,那么为什么我得到奇怪的输出?

asp.net - 更新 .dbml 文件

ASP.NET MVC 应用程序分析

asp.net - 需要用户登录的 UnitTest ASP.NET 应用程序

c# - 没有反射的 MVC4