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

简介: 转自 http://www.cnblogs.com/think8848/archive/2011/03/20/1989376.html 原以为可以使用之前的多国语言方案进行编程了,没想到第一个正式点的页面就卡了,为什么呢,因为通过HtmlHelper只能找到当前请求的View是哪个,如果这个View使用了Layout或是Partial就歇菜了。

转自 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;
    }
}
目录
相关文章
|
XML 前端开发 安全
构建自己的MVC框架(Ruby语言实现)-- 2. 创建ApplicationController
构建自己的MVC框架(Ruby语言实现)-- 2. 创建ApplicationController
|
前端开发 关系型数据库 开发工具
构建自己的MVC框架(Ruby语言实现)-- 开篇
构建自己的MVC框架(Ruby语言实现)-- 开篇
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
XML 前端开发 应用服务中间件
Cannot resolve MVC View解决方案
Cannot resolve MVC View解决方案
541 0
Cannot resolve MVC View解决方案
|
前端开发 Java 数据库连接
基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
752 0
|
前端开发 关系型数据库 开发工具
构建自己的MVC框架(Ruby语言实现)-- 第一章 从零到“它工作了!”
构建自己的MVC框架(Ruby语言实现)-- 第一章 从零到“它工作了!”
|
开发框架 前端开发 .NET
ASP.NET Core MVC 从入门到精通之Razor语法
ASP.NET Core MVC 从入门到精通之Razor语法
437 0
|
SQL 存储 开发框架
ASP.NET 使用语言集成查询 LINQ进行数据访问
ASP.NET 使用语言集成查询 LINQ进行数据访问
ASP.NET 使用语言集成查询 LINQ进行数据访问
|
开发框架 前端开发 NoSQL
ASP.Net Core Razor+AdminLTE 小试牛刀(下)
一个基于 bootstrap 的轻量级后台模板,这个前端界面个人感觉很清爽,对于一个大后端的我来说,可以减少较多的时间去承担前端的工作但又必须去独立去完成一个后台系统开发的任务,并且,文档还算比较齐全,对着demo可以完成一个基本的前端框架搭建了。大家如有更为好看的又方便后端上手的前端框架,也可以在留言区分享一下呗。
ASP.Net Core Razor+AdminLTE 小试牛刀(下)
|
开发框架 前端开发 JavaScript
ASP.Net Core Razor+AdminLTE 小试牛刀(上)
一个基于 bootstrap 的轻量级后台模板,这个前端界面个人感觉很清爽,对于一个大后端的我来说,可以减少较多的时间去承担前端的工作但又必须去独立去完成一个后台系统开发的任务,并且,文档还算比较齐全,对着demo可以完成一个基本的前端框架搭建了。大家如有更为好看的又方便后端上手的前端框架,也可以在留言区分享一下呗。
ASP.Net Core Razor+AdminLTE 小试牛刀(上)