使用 ASP.NET MVC 的多语言 URL

2024-01-02

我正在制定一个新项目的概念,我需要支持多语言 URL。理想情况下,所有 URL 都需要使用用户的母语。所以我们不想使用domain.com/en/contact and 域名.com/es/contact但我们喜欢域名.com/contact and 域名.com/contactar(contactar 是西班牙语的联系方式)。在内部,两者应该路由到相同的接触控制器 class.

这可以通过为每种语言向 Global.asax.cs 添加多个静态路由来处理,但我们希望使其变得非常动态,并且希望系统用户能够通过内容管理更改 URL 的翻译系统。因此,我们需要某种从 URL 到控制器和操作的动态映射。

通过查看MVC3的源代码我发现进程请求初始化的方法MvcHandler负责确定要创建哪个控制器。它只是看起来在路线数据获取控制器的名称。覆盖默认 MVC 路由的一种方法是创建一个使用自定义的简单默认路由路由处理程序. This 路由处理程序强制 MVC 使用我自己的自定义子类版本MvcHandler覆盖进程请求初始化方法。这个重写的方法将我自己动态找到的控制器和操作插入到路线数据在调用回原来的之前进程请求初始化.

我试过这个:

全局.asax.cs

routes.Add(
    new Route("{*url}", new MultilingualRouteHandler())
    {
        Defaults = new RouteValueDictionary(new { controller = "Default", action = "Default" })
    }
);

多语言RouteHandler.cs

public class MultilingualRouteHandler : IRouteHandler
{

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new MultilingualMVCHandler(requestContext);
    }

}

多语言 MvcHandler.cs

public class MultilingualMVCHandler : MvcHandler
{

    public MultilingualMVCHandler(RequestContext context) : base(context)
    {
    }

    protected override void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
    {

        if (RequestContext.RouteData.Values.ContainsKey("controller"))
        {
            RequestContext.RouteData.Values.Remove("controller");
        }

        if (RequestContext.RouteData.Values.ContainsKey("action"))
        {
            RequestContext.RouteData.Values.Remove("action");
        }

        RequestContext.RouteData.Values.Add("controller", "Product");
        RequestContext.RouteData.Values.Add("action", "Index");

        base.ProcessRequestInit(httpContext, out controller, out factory);

    }

}

在此处理程序中,出于测试目的,我将控制器和操作硬编码为一些固定值,但使其动态化并不困难。它可以工作,但唯一的问题是我必须修改 ASP.NET MVC3 的源代码才能使其工作。问题是进程请求初始化的方法MvcHandler是私有的,因此不能被覆盖。我修改了源代码并将其更改为受保护的虚拟,这允许我覆盖它。

这一切都很好,但可能不是最好的解决方案。我总是需要分发我自己的 System.Web.Mvc.dll 版本,这很麻烦。如果能配合 RTM 版本使用就更好了。

我是否错过了挂钩 ASP.NET MVC 的任何其他可能性,这些可能性允许我根据 URL 动态确定要启动的控制器和操作?我想到的另一种方法是构建路由集合动态地在 *Application_Start* 上进行,但我认为这将使动态更改它变得更加困难。

如果我还没有找到任何有关钩子的提示,我将不胜感激。


这现在已经相当老了,以防万一其他人正在寻找类似的东西......

除非我完全误解了你想要做什么,否则它真的很简单。

步骤 1:向 global.ascx.cs 添加一条新路由,其中​​包含对您的个人路由引擎的引用

routes.Add(new MyProject.Routing.ContentRoutingEngine());

确保它位于路由列表中的正确位置,以便其他路由引擎可以在需要时捕获它之前的内容,或者如果您的引擎不处理特定路由,则继续路由搜索。我把它放在忽略之后,但在 MVC 默认路由之前。

步骤 2:创建内容路由引擎,确保它继承自 System.Web.Routing.RouteBase 抽象类,并根据需要重写 GetRouteData 和 GetVirtualPath 方法,例如

public class ContentRoutingEngine : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeHandler = new MvcRouteHandler();
        var currentRoute = new Route("{controller}/{action}", routeHandler);
        var routeData = new RouteData(currentRoute, routeHandler);

        // set your values dynamically here
        routeData.Values["controller"] = "Home" ;
        // or
        routeData.Values.Add("action", "Index");

        // return the route, or null to have it passed to the next routing engine in the list
        return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        //implement this to return url's for routes, or null to just pass it on
        return null;
    }
}

这样就可以了。您可以在引擎中根据需要动态更改路由,无需更改 MVC 源。让标准 MVC 路由处理程序实际调用控制器。

后记:显然上面的代码不是生产标准 - 编写它是为了让发生的事情尽可能明显。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ASP.NET MVC 的多语言 URL 的相关文章

随机推荐

  • 带有 objectselect 表单的 Doctrine 自定义存储库

    这个问题是一个可能的解决方案ZF2 Doctrine 与 objectSelect 获得多对多关系 https stackoverflow com questions 24017193 zf2 doctrine get manytomany
  • 什么是 switch 表达式以及它们与 switch 语句有何不同?

    作为 Java SE 12 的一部分 switch表达式 https docs oracle com en java javase 13 language switch expressions html被引入 并且自 Java SE 14
  • 如何用 Python 编写一系列 Promise?

    是否可以写出一个序列promise https developer mozilla org en docs Web JavaScript Reference Global Objects Promise 或任务 使用only Python
  • 如何在 Xcode 构建阶段运行 Grunt 任务?

    我正在开发一个 Web 应用程序 其中包括 GruntJS 构建任务 我在 Xcode IDE 中使用 Phonegap Cordova 进行部署 我想将 grunt 构建过程集成到我的 Xcode 项目中以简化项目的运行 理想情况下 Xc
  • Environment.SpecialFolder.ApplicationData 返回错误的文件夹

    我有一个奇怪的问题 我的 NET 4 0 WPF 应用程序正在将数据保存到 ApplicationData 文件夹 Environment GetFolderPath Environment SpecialFolder Applicatio
  • Log4J Swing Appender

    我需要将 log4j 内容附加到 Swing 组件 JTextArea 或类似组件 有一个通用的方法可以做到这一点吗 我最终没有引入外部库 而是编辑 log4j properties 文件以包含以下内容 log4j rootCategory
  • 对 HttpModule 中的事件进行单元测试

    我的应用程序中有一个 CustomHttp 模块 用于删除不需要的响应标头 如下所示 public class RemoveServerHeadersModule IHttpModule public void Init HttpAppli
  • 函数调用超时

    我正在 Python 中调用一个函数 我知道该函数可能会停止并迫使我重新启动脚本 如何调用该函数或者将其包装在什么中 以便如果花费时间超过 5 秒 脚本就会取消该函数并执行其他操作 您可以使用signal http docs python
  • 在Visual Studio中调试Qt,缺少msvcp140d_app.dll

    我是新来的Qt 但一直在与视觉工作室 for C C 发展了几年 现在我正在尝试建立一个GUI对于我的项目 我安装了Qt 5 11 0和Qt我的工作计算机和家庭 PC 上都有 VS Tools 在工作中 我可以使用 VS 调试器构建和运行我
  • 删除重复项及其内在价值[重复]

    这个问题在这里已经有答案了 假设下一个向量 just a random vector lt c A B B C C D 这个想法是 如果某个值有重复项 则删除所有重复值和该值本身 为了得到看起来像这样的东西 A D 有什么办法可以得到上面的
  • D3.js 醉酒工具提示

    D3 js 能够支持醉酒提示吗 如果可能的话 有人可以给我举个例子吗 谢谢 这是一个工作示例 使用 jQuery Tipsy 的 D3 工具提示 http bl ocks org 1373263
  • 像 @Override 这样的注释在 Java 内部是如何工作的?

    谁能向我解释一下 java 内部注释是如何工作的 我知道如何使用 java 中的 java lang annotation 库创建自定义注释 但我仍然不明白它的内部工作原理 例如 Override 注释 如果有人能详细解释这一点 我将非常感
  • 将图像源设置为 URI

    如果我有一个在线图像的链接 并且我想将图像源设置为此 uri 我应该如何做最好 我正在尝试的代码如下所示
  • 一段时间后更改文档中的变量值?

    我对网络开发很陌生 我想学习新东西 我有一个猫鼬模式 我不会发布它 因为它是用我自己的语言写的 你不会理解 所以我会解释 所以我有诸如名称 代码 创建条目的用户等信息 与我的问题无关 我有一个变量 比如说日期 如下所示 type Date
  • 使用 numpy 在 Python 中导入 nastran 节点套牌

    如果我想将 Nastran Deck 导入到 Python 数组中 可以使用 numpy 一次性完成 我该怎么办呢 我哪里错了 我有一个仅包含网格的文件 网格均与 Nastran 的短翻译器等距 8 个字符 MH Nodes 2345678
  • Jquery从左到右的动画宽度

    我正在尝试对菜单元素进行动画处理 在鼠标悬停时将宽度从 170 像素缩小到 150 像素 我的问题是 默认的 animate 收缩发生在矩形的右侧 我需要它在左侧收缩 我已经尝试过对左边距进行动画处理 但由于元素内部有文本 因此它在动画过程
  • log4j2 中增强的 Throwable 渲染器

    log4j2 中是否存在与增强型 Throwable Renderer 类 存在于 log4j1 中 等效的类 我正在将一个库迁移到 log4j2 但我没有看到 log4j2 支持此功能 任何帮助表示赞赏 在 log4j2 中 图案布局 h
  • 加载多个属性文件

    Java 中是否可以堆叠加载的属性 例如我可以这样做 Properties properties new Properties properties load new FileInputStream file1 properties pro
  • .NET mvc3 验证最小长度,但不是必需的

    我目前正在使用 MVC 数据注释对我的模型执行验证 MinLength 4 ErrorMessage The 0 must be at least 2 characters long MaxLength 16 ErrorMessage Th
  • 使用 ASP.NET MVC 的多语言 URL

    我正在制定一个新项目的概念 我需要支持多语言 URL 理想情况下 所有 URL 都需要使用用户的母语 所以我们不想使用domain com en contact and 域名 com es contact但我们喜欢域名 com contac