使用Asp.net中的路由在URL中添加语言名称

使用Asp.net中的路由在URL中添加语言名称,asp.net,url,url-routing,Asp.net,Url,Url Routing,如何使用路由在URL中添加语言名称 我的网站运行于http://localhost:41213/default.aspxURL成功,但此网站使用多语言,我的客户希望按照他想要的语言运行此网站http://localhost:41213/en/default.aspx而不是http://localhost:41213/default.aspxURL 所以我的问题是,如何在URL中添加en、es、hi等,以及如何读取这些内容?default.aspx页面位于根目录中,它是主页。最好的方法可能是创建一

如何使用路由在URL中添加语言名称

我的网站运行于
http://localhost:41213/default.aspx
URL成功,但此网站使用多语言,我的客户希望按照他想要的语言运行此网站
http://localhost:41213/en/default.aspx
而不是
http://localhost:41213/default.aspx
URL


所以我的问题是,如何在URL中添加en、es、hi等,以及如何读取这些内容?default.aspx页面位于根目录中,它是主页。

最好的方法可能是创建一个初始页面,让用户选择所需的语言。然后站点将一个cookie加载到他的浏览器中,指示他的语言偏好。在随后的访问中,您的站点会读取cookie并自动将其带到其语言首选项。

在global.asax中使用此代码

public static void RegisterRoutes(System.Web.Routing.RouteCollection routes)
    {
        routes.Add(new System.Web.Routing.Route("{language}/{*page}", new CustomRouteHandler()));
    }
void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(System.Web.Routing.RouteTable.Routes);
    }
void Application_BeginRequest(object sender, EventArgs e)
    {
        string URL = HttpContext.Current.Request.Url.PathAndQuery;
        string language = TemplateControlExtension.Language;
        if (URL.ToLower() == "/default.aspx")
        {
            HttpContext.Current.Response.Redirect("/" + language + URL);
        }
    }
创建一个如下的路由器处理程序类

public class CustomRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string language = TemplateControlExtension.GetString(null, requestContext.RouteData.Values["language"]).ToLower();
        string page = TemplateControlExtension.GetString(null, requestContext.RouteData.Values["page"]).ToLower();

        if (string.IsNullOrEmpty(page))
        {
            HttpContext.Current.Response.Redirect("/" + language + "/default.aspx");
        }

        string VirtualPath = "~/" + page;

        if (language != null)
        {
            if (!VIPCultureInfo.CheckExistCulture(language))
            {
                HttpContext.Current.Response.Redirect("/" + SiteSettingManager.DefaultCultureLaunguage + "/default.aspx");
            }
            TemplateControlExtension.Language = language;
        }
        try
        {
            if (VirtualPath.Contains(".ashx"))
            {
                return (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(IHttpHandler));
            }
            return BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
        }
        catch
        {
            return null;
        }
    }
}

通过使用这个,我希望您的要求已经满足….

我做了这个,这个很好,但是我的客户希望根据这个/en US/添加这个URL,所以他希望这样,因为这对SEO太友好了。只是澄清一下:您的客户希望在URL中键入/en US/而不是选择“US English”从页面上的一组选项中?他说,当我们选择任何其他语言时,URL已经更改,URL获取了新的文化信息,所以他想要相同的功能,这可以通过路由实现,但如何实现?听起来好像你在问如何建立一个多语言网站。如果是这样,有多种方法,但一种方法是在不同的路径中复制内容。一个路径用于英语,一个路径用于西班牙语,等等。但是,这使得维护内容非常困难。更复杂的方法是,让所有语言内容都从数据库中提供,该数据库中的每个消息/语言组合都有条目。我尝试在scenerio中使用此代码,但在“TemplateControlExtension”和“BuildManager”,你能把这些课程的参考资料传给我吗?谢谢