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本地化(另类解决方案)<下>

目录
相关文章
|
2月前
|
网络协议 Java Linux
Java 异常 java.net.UnknownHostException 的原因和解决方案
Java 异常 java.net.UnknownHostException 的原因和解决方案
|
16天前
|
监控 Linux C#
【干货分享】.NET人脸识别解决方案
【干货分享】.NET人脸识别解决方案
|
1月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
72 0
|
2月前
|
机器学习/深度学习 算法 数据可视化
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
MATLAB基于深度学习U-net神经网络模型的能谱CT的基物质分解技术研究
|
2月前
|
Windows
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
559 0
|
2月前
|
XML 前端开发 应用服务中间件
Cannot resolve MVC View解决方案
Cannot resolve MVC View解决方案
155 0
Cannot resolve MVC View解决方案
|
2月前
|
消息中间件 存储 NoSQL
.NET开源的处理分布式事务的解决方案
.NET开源的处理分布式事务的解决方案
|
8月前
|
SQL 监控 NoSQL
一个.Net Core开发的,撑起月6亿PV开源监控解决方案
一个.Net Core开发的,撑起月6亿PV开源监控解决方案
45 0
|
9月前
|
Kubernetes 监控 网络协议
【K8S系列】Weave Net 故障排除的常见问题和解决方案
【K8S系列】Weave Net 故障排除的常见问题和解决方案
146 0
|
2月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
118 0