asp.net MVC3, webform和Unity 2实现的多语言方案

简介: 半年多没有写博了。今天稍微写点。今天写的这些东西还是在今年四到六月的时候在美国工作时获得的一点东西。公司派过去的拿工作签证在那里工作。客户是美国运通。项目是他们的一个叫Serve的电子钱包服务平台。当时主要是设计并实现MVC 3的多语言方案。

半年多没有写博了。今天稍微写点。今天写的这些东西还是在今年四到六月的时候在美国工作时获得的一点东西。公司派过去的拿工作签证在那里工作。客户是美国运通。项目是他们的一个叫Serve的电子钱包服务平台。当时主要是设计并实现MVC 3的多语言方案。这些技术方案都有现成的。比如msdn上就有链接。那篇英文博文用了不同的视图来实现多语言。在客户这里他们的需求和那篇博文的情况不一样。客户这里的需求是希望controller和view都有本地化版本,model就在多语言之间共享。他们希望在同一套编译出的程序,只需要改一下web.config,就能切换语言,其界面,和商务逻辑也跟着变了。同时技术上的要求也和那篇博文不一样,还需要利用Unity 2来实现对不同的商务逻辑和controller,view的访问;另外他们这里的系统挺庞大,旧的webform页面也很多,这次只把一部分页面转换成MVC技术,所以我们也得为webform准备解决方案。最开始的时候是先熟悉一下环境,做一些技术预研制。我是工作快20年的人了,很快进入了角色。

  开始做了一个webform的多语言,这是成熟技术了。没啥好说的。我们用的都是全局资源。类似这样的代码就会有很多:<title><asp:Literal Text='<% $ Resources: Glossary, DefaultPageTitle %>' runat="server"></asp:Literal></title>,还试着实时换界面。这次在那里学到了一个以前没有了解的技术,就是ExpressionBuilder,这个技术可以让Page请求处理过程中动态地解析所需要的资源。如过不用ExpressionBuilder,就只能继承所有的常用的webform服务器端控件,在新的子类里面加上一个资源名属性,只要这个属性的值被设置上,就可以去相关全局资源里取得相应资源。客户这里本来就是已经把所有webform的服务器端控件全都继承了,写了新类。所以用第二种方法也是可行的。实际也是这么做的。

  至于MVC。我们想出来了一个解决方案。即在Global.asax.cs里面应用启动的时候,创建Unity 容器,Unity配置是只需要将那些controller所在的名称空间写在Unity配置文件里面即可。另外需要继承DefaultControllerFactory类。这是默认的controller创建的类。我们需要改写该类。当我们需要将某个controller实例化的时候,Unity容器会自动去这些名称空间找到符合该名字的controller类并返回一个该类的实例。这里有一个问题,就是多个语言的controller是同样的名字的,这会让Unity报错的。所以我们得覆盖掉DefaultControllerFactory类的GetControllerType方法。当判断到当前线程的culture是什么的时候,就知道应该取哪个controller了。只需要取得相应controller的Type, 然后返回就可以了。剩下的事情就都交给Unity来实现就可以了。

  尽管实现了根据culture来选择controller, 该controller对应的view还需要进行设置。如果没有进行设置,其默认的view还是英语的。需要设置其对应语言的view的path.如中文的view, 动态地取得viewengine, 将viewengine的viewpath改成中文的viewpath.这样的话,就可以有若干个区分开的view, 每一个对应一种语言,它们可以有不同的布局,不同的字段。

  View所绑定的model是一个多个语言组合起来的。它有美国特有的字段,也有中国特有的字段。当用于美国时,中国特有的字段就空着。用于中国时,美国的那些特殊字段就空着。model每个字段的显示label是用自定义的attribute实现的,这些attribute可以从全局资源文件里取出字串。还有做数据验证的正则attribute,美国的数据验证和中国的几不一样,例如邮编,美国可以是5位或者9位,而中国是6位。其对应的正则也是不同的。这个正则attribute里可以根据当前线程的culture来取得正确的正则表达式。从而实现对美国和中国的不同数据验证。

  以上都只是一些思想。代码就不贴了。其实我手头也没有。全都在客户那里。这是商业代码。不可能拿出来的。

目录
相关文章
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
46 0
|
14天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
21 0
|
5月前
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
2月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0
|
2月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
108 5
|
9月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
123 0
|
10月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0
|
10月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
119 0
|
10月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
145 0
|
6月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0