国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

asp.net 2.0實現語言和主題的切換

2024-07-10 13:10:54
字體:
來源:轉載
供稿:網友
在asp.net 2.0 中提供多語言轉換和多樣式主題轉換功能,兩種實現形式比較類似,所以放在一起說明一下。
  1. language switcher 多語言轉換
  在quick start tutorial 中,介紹了如何存儲和應用用戶選擇的語言。一般是用一個dropdownlist展示支持的語言,供用戶選擇,通常是放在masterpage 里面,將用戶選擇的語言存儲起來 這里用了asp.net 2.0的profile,當然也可以存在cookie session 或者querystring里。在頁面里重寫initializeculture 方法,使用用戶之前選擇的語言。因為設置語言的操作 (這里是selectedindexchanged事件)發生在initializeculture 時間后面,所以在設置操作完成后為了使的當前頁面也馬上生效,需要做個重轉向,以從新加載本頁面,觸發initializeculture 事件。下面使quickstart中的部分代碼,注意紅色部分。因為有的頁面地址后面可能還存在queystring,所以個人覺得紅色代碼部分最好用response.redirect(request.url.pathandquery);代替。
   protected void dropdownlanguage_selectedindexchanged(object sender, eventargs e)
   {
   string selectedlanguage = dropdownlanguage.selectedvalue.tostring();
   //save selected user language in profile
   profile.setpropertyvalue("preferredculture", selectedlanguage);
  
   //force re-initialization of the page to fire initializeculture()
   response.redirect(request.url.localpath);
   }
   protected override void initializeculture()
   {
   // override virtual method initializeculture() to check if profile contains a user language setting
   string userculture = profile.getpropertyvalue("preferredculture").tostring();
   if ( userculture != "")
   {
   // there is a user language setting in the profile: switch to it
   thread.currentthread.currentuiculture = new cultureinfo(userculture);
   thread.currentthread.currentculture = cultureinfo.createspecificculture(userculture);
   }
   }
  為了減少代碼的重復,一般會自定義一個customer base page類,使它繼承page類,然后在自定義的頁基類中重新initializeculture方法。最后把你的每個頁面繼承自你的自定義頁面基類。這樣你就不需要每個頁面都重寫initializeculture方法了。
  
  但是上面這個方法還是不是很爽,因為每添加一個頁面都要去修改后置代碼,來繼承自定義頁基類。
  我們注意到,在initializeculture方法中實際上只是修改了當前線程的culture和uiculture。那么可不可以在一個全局的事件中,比如application的某個事件,來修改這兩個屬性呢?很早以前我這么試過,在application的beginrequest事件觸發時來實現initializeculture 的細節,類似于下面代碼:
   void application_beginrequest(object sender, eventargs e)
   {
   string lang = string.empty;//default to the invariant culture
   lang = profile.preferredculture;
   if (string.isnullorempty(lang))
   {
   lang = string.empty;
   }
   thread.currentthread.currentuiculture = cultureinfo.getcultureinfo(lang);
   thread.currentthread.currentculture = cultureinfo.createspecificculture(lang);
   }
  注意紅色部分應用其他方式取代,因為在beginrequest觸發階段,profile對象還沒有被asp.net創建。可以用cookies取代。
  我記得當時這么做后,語言設置后并不起作用,當時認為在全局事件中處理,可能到后來還是會被覆蓋掉,所以可能不行。所以當時還是用了 initializeculture方法。今天在asp.net論壇里看到有人如此實現了,
  void application_beginrequest(object sender, eventargs e){
   string lang = string.empty;//default to the invariant culture
   httpcookie cookie = request.cookies["dropdownname"];
  
   if (cookie != null && cookie.value != null)
   lang = request.form[cookie.value];
  
   thread.currentthread.currentuiculture = cultureinfo.getcultureinfo(lang);
   thread.currentthread.currentculture = cultureinfo.createspecificculture(lang);
  }
  
  
  
  
  所以覺得當時可能哪里沒有設置好,于是又試了一次,原來是頁面頭指令<%@ page uiculture="auto" culture="auto" %>的原因,如果在頁面中設置了uiculture和culture后,它們就會覆蓋掉在全局中的設置。去掉之后,全局設置起作用了。看來頁面中的culture的設置會覆蓋全局的設置,而頁面中initializeculture方法(確切說是一切支持該方法的控件)的設置會覆蓋頁面的設置。其實在page類中initializeculture方法的默認實現是空的,因此再將頁面頭指令 uiculture="auto" culture="auto" 去掉后,global中的設置就起作用了。
  另外,如果很想使用profile(像我一樣)來存儲用戶的選擇,那就不能在beginrequest階段來處理了,我是在prerequesthandlerexecute事件觸發時處理:
   void application_prerequesthandlerexecute(object sender, eventargs e)
   {
   string lang = string.empty;//default to the invariant culture
  
   lang = profile.preferredculture;
   if (string.isnullorempty(lang))
   {
   lang = string.empty;
   }
   thread.currentthread.currentuiculture = cultureinfo.getcultureinfo(lang);
   thread.currentthread.currentculture = cultureinfo.createspecificculture(lang);
   }
  這個時候profile已經被創建了,所以可以使用了。
  2. 多樣式主題轉換 theme switcher
  這篇文章講了theme的切換,覺得形式上和語言的切換很類似。他使用了httpmodule,我覺得直接放在global.asax文件里對應的事件處理發放下就可以了,說到底都是一樣的。他的存儲采用了cookie,我還時覺得用profile好,既然提供了就用唄,profile應該是有緩存的吧,所以性能應該不是問題。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新晃| 五大连池市| 且末县| 沭阳县| 肥城市| 大渡口区| 博白县| 长葛市| 旬阳县| 潍坊市| 内乡县| 开原市| 临江市| 博乐市| 广水市| 油尖旺区| 娱乐| 郸城县| 张家口市| 巧家县| 准格尔旗| 湄潭县| 灯塔市| 百色市| 贺州市| 小金县| 宝鸡市| 台南县| 平利县| 凯里市| 安远县| 葫芦岛市| 绥滨县| 齐河县| 敖汉旗| 巫山县| 应用必备| 黄平县| 白玉县| 凤翔县| 华蓥市|