MVC2.0本“.NET研究”地化(另类解决方案)<上>

简介:   前不久看见一篇文章:在asp.net中使用Response.Filter 过滤网站敏感字符的解决方案。于是我借题发挥用Response.Filter 为MVC2.0 进行多国语言本地化。如果存在不足的地方,希望您指出。

  前不久看见一篇文章:在asp.net中使用Response.Filter 过滤网站敏感字符的解决方案。于是我借题发挥用Response.Filter 为MVC2.0 进行多国语言本地化。如果存在不足的地方,希望您指出。

  本文主要给出具体思路,希望能给读者带来一定的启发:日常开发中不是所有的方案要中规中矩用常用方法解决问题。比如本文的本地化就不用resource文件来处理。

  具体步骤:

  一、建立自定义的LocalizationHandler类

  LocalizationHandler 继承System.IO.Stream类 ,LocalizationHandler实例化后赋值给Response.Filter。这里主要通过Response.Filter来本地化MVC2.0程序。具体的Response.Filter 用法请参看MSDN.代码如下:

 public class LocalizationHandler : Stream
    {
        private Stream responseStream;
        public LocalizationHandler(Stream inputStream)
    上海徐汇企业网站设计与制作    {
            respons上海企业网站制作eStream = inputStream;
        }
        public override bool CanRead
        {
            get { return true; }
        }
        public override bool CanSeek
        {
            get { return true; }
        }
        public override bool CanWrite
        {
            get { return true; }
        }
        public override void Flush()
        {
            responseStream.Flush();
        }
        public override long Length
        {
            get { return 0; }
        }
        long postion;
        public override long Position
        {
            get
            {
                return postion;
            }
            set
上海网站建设            {
                postion = value;
            }
        }
        publ上海闵行企业网站制作ic override int Read(byte[] buffer, int offset, int count)
        {
            return responseStream.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return responseStream.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            responseStream.SetLength(value);
        }
        public override void Write(byte[] buffer, int offset, int count)
        {
            string sBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
            string pattern = @"(|)=(.*?)(|)";//正则替换类似页面格式为这样的字符串如:=Oth上海徐汇企业网站制作erContent
            sBuffer = Regex.Replace(sBuffer, pattern, delegate(Match c)
            {
                return ReadLocalizationResource()上海企业网站设计与制作.FirstOrDefault(d = d.Key == c.Groups[2].Value).Value;
            });
            ReadLocalizationResource();
            byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(sBuffer);
            responseStream.Write(data, 0, data.Length);
        }
        ObjectCache cache = MemoryCache.Default;
        private Dictionarystring, string ReadLocalizationResource()
        {
            string _XMLPath = "";
            Dictionarystring, string cacheData = null;
            if (cacheData != null)
            {
                return cacheData;
            }
            Dictionarystring, string cachedData = new Dictionarystring, string();
            string serverPath = System.Web.HttpContext.Current.Server.MapPath("~");
            _XMLPath = Path.Combine(serverPath, "LocalizationResource.xml");
            //建立缓存(使用.net4.0最新缓存机制:System.Runtime.Caching;)
            if (cache["myCache"] == null)
            {
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.SlidingExpiration = TimeSpan.FromMinutes(60);
                policy.ChangeMonitors.Add(new HostFileChangeMonitor(new Liststring { _XMLPath }));
                var items = XElement.Load(_XMLPath).Elements("Module").Elements("item");
                foreach (var item in items)
                {
                    string key = item.Attribute("name").Value;
                    string value = item.Va上海闵行企业网站设计与制作lue;
                    cachedData.Add(key, value);
                }
                cache.Set("myCache", cachedData, policy);
                return cachedData;
            }
            return (Dictionarystring, string)cache["myCache"];
        }
    }

  代码中的65行开始,是本地化核心代码,在这里我们用正则匹配文本。用.NET4.0 System.Runtime.Caching;(尝鲜)缓存机制提高程序执行效率。

  二、修改global.asax文件

  在global.asax中加入以下代码:

protected void Application_BeginRequest(Object sender, EventArgs e)
        {
            Response.Filter = new LocalizationHandler(Response.Filter);
        }

  三、建立自定义的XML本地化资源文件

  截图如下:

  OK,一切准备就绪,我们在不用Response.Filter 过滤的情况下,运行截图如下:

  使用上文中Response.Filter过滤后:

  结果将第三点中的XML作为传统的资源文件后本地化了MVC View 页面。

  四、小结

  本文用另外一套方案解决了MVC2.0程序的本地化问题,也适用于asp.net webform。同时本文还存在很多不足的地方,比如后台异步的JSON格式本地化、用户自定义本地化语言等将会在MVC2.0本地化(另类解决方案)下 文中得到完善。

  希望本篇文章可以给您带来帮助,如有不足之处欢迎指出,谢谢!

  相关文章:MVC2.0本地化(另类解决方案)<下>

目录
相关文章
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
171 3
|
4天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
3月前
|
监控 网络安全 调度
Quartz.Net整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案
解决Quartz.NET在.NET Core 3.1应用中部署到IIS服务器上不被调度的问题,通常需要综合考虑应用配置、IIS设置、日志分析等多个方面。采用上述策略,结合细致的测试和监控,可以有效地提高定时任务的稳定性和可靠性。在实施任何更改后,务必进行充分的测试,以验证问题是否得到解决,并监控生产环境的表现,确保长期稳定性。
130 1
|
4月前
|
存储 安全 物联网
.NET 跨平台工业物联网网关解决方案
【9月更文挑战第28天】本文介绍了利用 .NET 构建跨平台工业物联网网关的解决方案。通过 .NET Core 和多种通信协议(如 MQTT 和 Modbus),实现工业设备的高效接入和数据采集。系统架构包括设备接入层、数据处理层、通信层、应用层和数据库层,确保数据的准确采集、实时处理和安全传输。此外,还详细阐述了设备身份认证、数据加密及安全审计等机制,确保系统的安全性。该方案适用于不同操作系统和工业环境,具备高度灵活性和扩展性。
|
4月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
51 7
|
4月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
85 0
|
5月前
|
API C#
.NET电子邮件高效处理解决方案
.NET电子邮件高效处理解决方案
|
5月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
66 0
|
5月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
5月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?