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

转自 http://www.cnblogs.com/think8848/archive/2011/03/20/1989376.html

 

原以为可以使用之前的多国语言方案进行编程了,没想到第一个正式点的页面就卡了,为什么呢,因为通过HtmlHelper只能找到当前请求的
View是哪个,如果这个View使用了Layout或是Partial就歇菜了。通过一番尝试,发现使用
HtmlHelper.ViewDataContainer属性可以获得一个WebViewPage对象,这个对象中的VirtualPath对象代表当
前正在Excute的页面属于哪个物理文件(.cshtml),于是修改代码如下:

public static class LocalizationHelper
{
    public static string Lang(this HtmlHelper htmlhelper, string key)
    {
        var viewPath = (htmlhelper.ViewDataContainer as WebViewPage).VirtualPath;
        var viewName = viewPath.Substring(viewPath.LastIndexOf('/'), viewPath.Length - viewPath.LastIndexOf('/')).TrimStart('/');
        var filePath = htmlhelper.ViewContext.HttpContext.Server.MapPath(viewPath.Substring(0, viewPath.LastIndexOf('/') + 1)) + "App_LocalResources";
        var langs = htmlhelper.ViewContext.HttpContext.Request.UserLanguages.Union<string>(new string[] { "" });
 
        IEnumerable<DictionaryEntry> resxs = null;
 
        foreach (var lang in langs)
        {
            var resxKey =
                string.IsNullOrWhiteSpace(lang) ? string.Format(@"{0}\{1}.resx", filePath, viewName) : string.Format(@"{0}\{1}.{2}.resx", filePath, viewName, lang);
 
            resxs = GetResx(resxKey);
 
            if (resxs != null) { break; }
        }
 
        return (string)resxs.FirstOrDefault<DictionaryEntry>(x => x.Key.ToString() == key).Value;
    }
 
    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;
    }
}
时间: 2024-09-10 01:15:52

ASP.NET MVC 3 Razor 多国语言参考解决方案 补充三的相关文章

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?

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

转自http://www.cnblogs.com/think8848/archive/2011/03/19/1988690.html 在上两篇(1,2)中提到了如何在应用程序项目中使用资源文件的问题,还没有测试在调用其他ClassLibrary中资源文件的情况,今早起来还按照以往ASP.NET项目中的作法做个测试 使用资源文件: public class Class1 {     public string GetTT()     {         return Resources.Test.

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

转自 http://www.cnblogs.com/think8848/archive/2011/03/17/1987072.html   话说当年张古董将老婆借给了李成龙,结果最后竟然一借不回了.这件事呢两个方面都要怪:张古董动机不纯,李成龙作人也不厚道,但一般情况下占人便宜是很上瘾的.   Reflector没有人不知道吧,.NET用了好多年的人可能已经不需要再去看.NET源代码了,一来是之前看过了,二来是很多的实现方式和运行原理能猜个七七八八的,但是对于初学者以及想查看有些不常用的.NET

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

转自 http://www.cnblogs.com/think8848/archive/2011/03/15/1984793.html   3月22日整理:实用示例请参考:这里 支持多国语言基本上是一个成熟产品必须支持的功能,但是直到想用这个功能时,发现居然找不到解决方案(很吃惊,真的没有提供么?),于是在网上搜索了好久,发现两种心仪的方案: 1: ASP.NET MVC 多语言解决方案 2: ASP.NET MVC - Localization Helpers 这两种方案都是针对WebForm

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

在<ASP.NET MVC的Razor引擎:RazorView>介绍BuildManagerCompiledView的时候,我们谈到默认使用的ViewPageActivator使用当前注册的DependencyResolver来完成对目标View的激活,这意味着我们可以通过注册自定义DependencyResolver的方式实现基于IoC的View激活.本篇文章中我们将演示如何通过自定义View的方式实现与IoC框架Ninject的集成. 我们定义了一个具有如下定义的NinjectDepend

ASP.NET MVC的Razor引擎:RazorViewEngine

基于Web Form引擎的WebFormViewEngine和针对Razor引擎的RazorViewEngine都是抽象类型BuildManagerViewEngine的子类,而后者又继承自VirtualPathProviderViewEngine.在这里我们仅仅对实现在RazorViewEngine中View获取的逻辑进行简单介绍.由于Razor引擎下的View通过RazorView对象来表示,而RazorView通过View文件的虚拟路径来构建,所以RazorViewEngine的View获

ASP.NET MVC 3: Razor中的@:和语法

原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor's @: and <text> syntax[原文发表时间] December 15, 2010 11:48 PM 这是我正在写的博文系列中的另一篇,涵盖ASP.NET MVC 3的一些新功能: ·        Razor中的新@模型关键字(10月19日) ·        Razor中的层(10月22日) ·        用Razor实现服务器端注释(11月12日)

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

原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行尾不需要加分号,加上也无妨(不过得全加上). VB.Net @Imports MvcApplication83.Models @Imports MvcApplication83.Common 配置文件中引用 必须在 Views 文件夹中的 Web.config 文件中添加引用.见下图: 打开该文件,

Java多国语言问题解决方案

随着经济全球化的发展,产生了众多的跨国公司,而Java语言的出现以及网 络通讯技术的飞速发展,使企业仅购买一套基于web的企业级应用软件(比如说 :OA系统,ERP系统.CRM等),通过网络就能满足整个集团共同使用该软件成为 可能.既减少了软件费用,又缩短了信息延迟,提高了企业运作效率.但因为应 用系统是面向多个国家,多种语言的,所以在设计软件时就不得不解决国际化( internationalization)问题,国际化的程序应支持多国语言,不同格式的日期 .时间.货币和其它值,还有操作界面的风