如何在 Asp.Net 项目中使语言特定于 Url?
How to Make Language Specific Url in Asp.Net Project?
我在我的项目中使用了 westwind 全球化库 http://west-wind.com/westwind.globalization/ 来实现多语言。一切正常。
只有一个问题是我在 url 的末尾获得了文化参考变量作为 http://localhost:18106/LangTest?LocaleId=en。
我想在域和页面名称之间使用文化参考变量,例如 http://localhost:18106/en/LangTest。
实际上我想像 Microsoft 网站那样做 http://www.microsoft.com/en-us/default.aspx 例如。
您需要使用 IRouteHandler 并且您需要创建自定义路由。
默认情况下,Web 窗体使用文件系统请求处理。例如 MyWebsite/contact.aspx 请求搜索位于根菜单下的 contact.aspx 文件。
MyWebsite/superheroes/superheroes.aspx 应该在根菜单下的 superheroes 文件中查找 superheroes.aspx 文件。
使用 global.asax 文件您可以添加我们自己的处理。
您所需要做的就是从 Application_Start 方法中调用一个具有 RouteCollection 参数的方法。
因此,您需要创建一个名为 RegisterRoutes 的方法,并将其放在一个名为 MyRouteConfig.cs
的新文件中
示例如下:
using System;
using Microsoft.AspNet.FriendlyUrls;
using System.Web.Routing;
using System.Web;
using System.Web.UI;
using System.Web.Compilation;
public static class MyRouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.EnableFriendlyUrls();
routes.MapPageRoute("superheroes", "superhero/{SuperheroName}", "~/superheroes.aspx");
routes.MapPageRoute("languageSuperheroes", "{language}/superhero/{SuperheroName}", "~/superheroes.aspx");
routes.Add(new System.Web.Routing.Route("{language}/{*page}", new LanguageRouteHandler()));
}
public class LanguageRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string page = CheckForNullValue(requestContext.RouteData.Values["page"]);
string virtualPath = "~/" + page;
if (string.IsNullOrEmpty(page))
{
string language= CheckForNullValue(requestContext.RouteData.Values["language"]);
string newPage = "/home";
if (!string.IsNullOrEmpty(language))
newPage = "/" + language + newPage;
HttpContext.Current.Response.Redirect(newPage, false);
HttpContext.Current.Response.StatusCode = 301;
HttpContext.Current.Response.End();
//Otherwise, route to home
//page = "home";
}
if (!virtualPath.Contains(".aspx"))
virtualPath += ".aspx";
try
{
return BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)) as IHttpHandler;
}
catch
{
return null;
}
}
}
}
请看这篇文章:
http://dotnethints.com/blogs/localization-using-routing-system-on-a-web-forms-project-
我在我的项目中使用了 westwind 全球化库 http://west-wind.com/westwind.globalization/ 来实现多语言。一切正常。 只有一个问题是我在 url 的末尾获得了文化参考变量作为 http://localhost:18106/LangTest?LocaleId=en。
我想在域和页面名称之间使用文化参考变量,例如 http://localhost:18106/en/LangTest。
实际上我想像 Microsoft 网站那样做 http://www.microsoft.com/en-us/default.aspx 例如。
您需要使用 IRouteHandler 并且您需要创建自定义路由。
默认情况下,Web 窗体使用文件系统请求处理。例如 MyWebsite/contact.aspx 请求搜索位于根菜单下的 contact.aspx 文件。 MyWebsite/superheroes/superheroes.aspx 应该在根菜单下的 superheroes 文件中查找 superheroes.aspx 文件。
使用 global.asax 文件您可以添加我们自己的处理。 您所需要做的就是从 Application_Start 方法中调用一个具有 RouteCollection 参数的方法。 因此,您需要创建一个名为 RegisterRoutes 的方法,并将其放在一个名为 MyRouteConfig.cs
的新文件中示例如下:
using System;
using Microsoft.AspNet.FriendlyUrls;
using System.Web.Routing;
using System.Web;
using System.Web.UI;
using System.Web.Compilation;
public static class MyRouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.EnableFriendlyUrls();
routes.MapPageRoute("superheroes", "superhero/{SuperheroName}", "~/superheroes.aspx");
routes.MapPageRoute("languageSuperheroes", "{language}/superhero/{SuperheroName}", "~/superheroes.aspx");
routes.Add(new System.Web.Routing.Route("{language}/{*page}", new LanguageRouteHandler()));
}
public class LanguageRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string page = CheckForNullValue(requestContext.RouteData.Values["page"]);
string virtualPath = "~/" + page;
if (string.IsNullOrEmpty(page))
{
string language= CheckForNullValue(requestContext.RouteData.Values["language"]);
string newPage = "/home";
if (!string.IsNullOrEmpty(language))
newPage = "/" + language + newPage;
HttpContext.Current.Response.Redirect(newPage, false);
HttpContext.Current.Response.StatusCode = 301;
HttpContext.Current.Response.End();
//Otherwise, route to home
//page = "home";
}
if (!virtualPath.Contains(".aspx"))
virtualPath += ".aspx";
try
{
return BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)) as IHttpHandler;
}
catch
{
return null;
}
}
}
}
请看这篇文章: http://dotnethints.com/blogs/localization-using-routing-system-on-a-web-forms-project-