zoukankan      html  css  js  c++  java
  • [原]ASP.NET MVC 3 Razor 多国语言参考解决方案 补充三

    原以为可以使用之前的多国语言方案进行编程了,没想到第一个正式点的页面就卡了,为什么呢,因为通过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;
            }
        }
    
  • 相关阅读:
    Java+Selenium元素定位的练习(三)
    Java+Selenium元素定位的八种方法(二)
    Java Selenium3 WebDriver启动火狐、Chrome、IE,Edge浏览器的方法(一)
    iOS userAgent
    如何强制视频横竖屏
    一些在开发中不曾注意的小知识,只是怕以后忘了,有迹可查
    多线程与并发
    谈谈那些年要把你弄疯的 bug
    底部导航上拉出现,下拉消失
    新闻详情页顶部的下拉放大与上拉的层叠效果
  • 原文地址:https://www.cnblogs.com/think8848/p/1989376.html
Copyright © 2011-2022 走看看