ASP.NET MVC 3 Razor 多国语言参考解决方案 补充四

转自 http://www.cnblogs.com/think8848/archive/2011/07/05/2098464.html

前四回(1,2,3,4)介绍了在ASP.NET MVC 3使用Razor ViewEngine时实现多国语言的解决方案,本以为就够用了,没料到今天居然在使用时又遇到新问题了。

先说需求,最近做了一套全新的页面样式,基本思路是在iframe中显示内容,那么毫无疑问,这些内容页就是MVC的视图了,但是主页以何种形式存
在呢?.html?.cshtml?.aspx?如果是.html的话,最主要的问题就是实现多图语言,服务器端不处理,难道使用js不成?而且不知道未
来还会不会有必须服务器端参与处理的事情呢;.aspx我也不愿意,说实话,我不喜欢aspx那繁琐的生命周期,更不喜欢.aspx那种自以为是,老是替
你作决定;于是决定使用.cshtml。

在之前建的Website项目中,我发现能添加.cshtml的文件,那在MVC的项目中,想必也能使用单独的.cshtml来作页面了,于是新建
一个.cshtml页面,把之前html页面复制进去,运行,发现果然如愿开启了页面,接下来把html中的占位符换成资源文件,如:

<a href="#">欢迎: </a>

换成

@Html.Lang("Welcome")

但是发现Html下面居然没有Lang扩展方法,在我的记忆中,view中输入@Html,自动完成列表中就会出现Lang方法了,为啥不行呢,扩展方法出不来的第一原因就是没有引入命名空间,于是在文件最上面加入

@using System.Web.Mvc

但是还是不行,想想也不行,@Html都有了,没有理由不出现扩展方法啊, 要么换一种方法调用,直接调用静态方法:

@LocalizationHelper.Lang(Html, "Welcome")

这下总行了吧,结果输入完成就发现问题不对劲了,这行代码下居然告诉我参数不匹配,就这么两个参数,一个Html属性,一个string,居然还不对,看了半天没有看出端倪,干脆我让VS自动生成匹配的方法,到底是啥样的方法签名,结果这一生成终于发现问题所在了:

public static object Lang(WebPages.Html.HtmlHelper htmlHelper, string p)
{
    throw new NotImplementedException();
}

这个HtmlHelper的命名空间是WebPages.Html,而我之前定义的方法中参数HmtlHelper的命名空间是System.Web.Mvc!怪不得呢,原来不是一个东西啊,看起来使用RazorEngine时,视图和页面不是同一种类型

本打算那就使用这个HtmlHelper类型当参数吧,又发现这个类型中只有一些辅助方法,没有Request、Response、Server之
类的对象实例,基于我在Lang方法内部是需要请求详细信息的,于是我打算使用将页面本身(WebPageBase)作为参数,于是修改为下面的样子:

public static string Lang(this WebPageBase page, string key)
{
}

接下来就是重构,最终LocalizationHelper变成了下面的样子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using CleverSoft.WebUtil;
using System.Runtime.Caching;
using System.Resources;
using System.Collections;
using System.Web.WebPages;
 
namespace System.Web.Mvc
{
    public static class LocalizationHelper
    {
        public static string Lang(this HtmlHelper htmlhelper, string key)
        {
            return Lang(htmlhelper.ViewDataContainer as WebViewPage, key);
        }
 
        private static IEnumerable<DictionaryEntry> GetResx(string resxKey)
        {
            ObjectCache cache = MemoryCache.Default;
 
            IEnumerable<DictionaryEntry> resxs = null;
 
            if (cache.Contains(resxKey))
            {
                resxs = cache.GetCacheItem(resxKey).Value as IEnumerable<DictionaryEntry>;
            }
            else
            {
                if (File.Exists(resxKey))
                {
                    resxs = new ResXResourceReader(resxKey).Cast<DictionaryEntry>();
                    cache.Add(resxKey, resxs, new CacheItemPolicy() { Priority = CacheItemPriority.NotRemovable });
                }
            }
 
            return resxs;
        }
 
        public static string Lang(this WebPageBase page, string key)
        {
            var pagePath = page.VirtualPath;
            var pageName = pagePath.Substring(pagePath.LastIndexOf('/'), pagePath.Length - pagePath.LastIndexOf('/')).TrimStart('/');
            var filePath = page.Server.MapPath(pagePath.Substring(0, pagePath.LastIndexOf('/') + 1)) + "App_LocalResources";
            var langs = page.Request.UserLanguages != null ?
                page.Request.UserLanguages.Union<string>(new string[] { "" }).ToArray<string>() : new string[] { "" };
 
            IEnumerable<DictionaryEntry> resxs = null;
 
            foreach (var lang in langs)
            {
                var resxKey =
                    string.IsNullOrWhiteSpace(lang) ? string.Format(@"{0}\{1}.resx", filePath, pageName) : string.Format(@"{0}\{1}.{2}.resx", filePath, pageName, lang);
 
                resxs = GetResx(resxKey);
 
                if (resxs != null) { break; }
            }
 
            return (string)resxs.FirstOrDefault<DictionaryEntry>(x => x.Key.ToString() == key).Value;
        }
    }
}

最终在Razor页面使用

@this.Lang("Welcome")

终于出现结果了

最终经过测试,在视图中使用@Html.Lang()也正常工作

posted on 2011-11-18 13:39 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/archive/2011/11/18/2253993.html

ASP.NET MVC 3 Razor 多国语言参考解决方案 补充四相关推荐

  1. ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用

    在<ASP.NET MVC的Razor引擎:RazorView>介绍BuildManagerCompiledView的时候,我们谈到默认使用的ViewPageActivator使用当前注册 ...

  2. 开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo项目分析

    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo,这个是一个在网上流传比较多的Spri ...

  3. ASP.NET MVC 3: Razor视图引擎中 @: 和text 语法【转载】

    ASP.NET MVC 3: Razor视图引擎中 @: 和<text> 语法[转载] (文章没翻译:建议大家读英文原文,看不懂查着看,顺便提高自己的英语水平!) In today's p ...

  4. ASP.NET MVC 自定义Razor视图WorkContext

    概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...

  5. ASP.NET MVC:Razor 引入命名空间

    原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行 ...

  6. html如何支持多国语言,[MVC]建置多国语言系统之路

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 分享以ASP.NET MVC 3一步一步建置一个多国语言系统的方式 1.从Resource File开始 2.利用Str ...

  7. ASP.NET MVC 利用Razor引擎生成静态页

    实现原理及步骤: 1.通过ViewEngines.Engines.FindView查找到对应的视图,如果是部分视图,则用:ViewEngines.Engines.FindPartialView: 2. ...

  8. 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案

    问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web ...

  9. Microsoft.NET多国语言资源解决方案

    微软从来都是把事情做到简单的,在软件多国语言这个问题上也不例外. 我们建立一个普通的WinForm应用程序,假如添加了个按钮,Button1 查看VS自动生成的代码应该有如下语句: Button1.T ...

最新文章

  1. 关于研发效能提升的思考,每个P8以及以上都应该懂!
  2. static_cast, dynamic_cast, const_cast
  3. 图片宽度自适应浏览器宽度
  4. 使用 Castle ActiveRecord
  5. docker重启后容器消失_docker设置固定ip地址
  6. 《大数据》2020年第3期目次摘要
  7. 在MFC中调用DLL .
  8. java流程图什么代表活动_举例分析流程图与活动图的区别与联系
  9. 《HALCON机器视觉与算法原理编程实践》第1章 机器视觉概述-学习笔记
  10. PostgreSQL ALTER TABLE 命令
  11. 汉王ocr sdk android,汉王标准印刷体OCR SDK技术白皮书.doc
  12. mysql条件触发器实例_mysql 触发器实例
  13. 高等代数期末考试题库及答案_高等代数Ⅱ答案期末答案
  14. DotNetBar控件的多文档界面的实现
  15. 三菱PLC控制器FX3GA USB驱动 程序下载
  16. 计算机usb 不显示错误的是,电脑插入U盘不显示USB Mass storage device感叹号
  17. 【总结】Go 学习路线(2022)
  18. vue3中播放视频和m3u8后缀的视频解决办法
  19. 电气火灾监控系统在杭州湾新区产业园区一期的设计与应用——安科瑞 陆琳钰
  20. 数仓工具—Hive源码之Beeline/HiveCli(4)

热门文章

  1. 两岸MVP强强联手--最硬Windows Server 2008达人
  2. Python中多层List展平为一层
  3. php如何删除数据库中的数据库文件夹,学习猿地-php数据库如何删除数据
  4. 有三个输入的自监督网络设计
  5. JavaScript实现重置表单(reset)的方法
  6. Keras入门(一)搭建深度神经网络(DNN)解决多分类问题
  7. python 爬预警没解析前的
  8. Liunx 查看硬件信息
  9. Android程序ToDoList增加配置项页面
  10. 活着的理由,做事的风格