2009-11-09 48 views
4

我想somewere我看到了有關這方面的例子,但無法找到它了:全局覆蓋Page_PreInit()而不創建子類化頁?

是否有一種方式來覆蓋全球基礎上Page_Init()事件,而無需創建從頁面繼承了新MyCustomPage類?

我希望有一些方法可以在沒有子類化頁面的情況下對頁面進行全局覆蓋(不需要從子類繼承我的頁面)。我正在考慮關於Global.asax的一些內容,但對於Page來說。提前爲你的時間

 
' Change Culture's ShortDate to "dd/mmm/yyyy" for es-MX. 
If CultureInfo.CurrentCulture.Name = "es-MX" Then 
    Dim info As CultureInfo = CultureInfo.CurrentCulture.Clone 
    info.DateTimeFormat.ShortDatePattern = "dd/MMM/yyyy" 
    System.Threading.Thread.CurrentThread.CurrentCulture = info 
    info = Nothing 
End If 

感謝:

這是我想要的代碼將在PreInit在每一頁上運行。

編輯:

截至今天,已經有2個非常好的解決方案(針對我的情況)以下提供。我已經選擇了其中一個作爲接受的答案,即使我目前正在使用其他解決方案。這是因爲我將使用的是@Simon對此問題的評論。

解決的辦法是把我的代碼在Global.asax中爲:

 
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 

    ' Configure ShortDatePattern as "dd/MMM/yyyy" for es-MX to avoid month-day confusions when both are numeric. 
    If CultureInfo.CurrentCulture.Name = "es-MX" Then 
     Dim oCultureInfo As CultureInfo = CultureInfo.CurrentCulture.Clone 
     oCultureInfo.DateTimeFormat.ShortDatePattern = "dd/MMM/yyyy" 
     System.Threading.Thread.CurrentThread.CurrentCulture = oCultureInfo 
     oCultureInfo = Nothing 
    End If 

End Sub 

在我的問題,我問如何重寫Page_Init()無子類頁。這似乎造成了一些混亂。原因是我正在創建一個項目模板,其中包含許多通常需要的功能(如用戶管理,權限管理等)。

對於使用此模板創建的項目,我想默認使用es-MX Culture並修改ShortDatePattern以在縮寫的月份名稱中顯示月份。由於這是一個項目模板,我希望我的程序員免於需要實現繼承自定義類的頁面。對我來說,在這個(項目模板)級別對頁面進行子分類時,感覺「很奇怪」。

另一種解決方案。我標記爲接受的是@Ishtar提供的。我已經實現了它,它完美的工作並符合我的需求。他提供的示例代碼中唯一缺少的是需要調用MyBase.OnInit(e)。

我想感謝所有提供解決方案和意見的人以及對@Ishtar非常特別的感謝,他們提供了初步的答案並留下了這個主題,因爲我拒絕了我的需求。然後他提供了第二個被證明是正確的答案(被標記爲接受的答案)。

+2

在PreInit中執行的代碼怎麼樣?您需要在Global.asax的BeginRequest中更改文化以捕捉完整的頁面生命週期。 – sisve 2009-11-09 06:18:46

+0

@Simon:是的,代碼在PreInit中工作(我會稍後更新我的問題)。但是我想避免的是需要對頁面進行子類化。 – vmarquez 2009-11-09 20:41:52

回答

6

另一位做到這一點的方法是使用頁適配器

public class TestPageAdapter : System.Web.UI.Adapters.PageAdapter 
{ 
    protected override void OnInit(EventArgs e) 
    { 

     if (Thread.CurrentThread.CurrentCulture.Name == "es-MX") 
     { 
      CultureInfo info = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone(); 
      info.DateTimeFormat.ShortDatePattern = "dd/MMM/yyyy"; 
      System.Threading.Thread.CurrentThread.CurrentCulture = info; 
      info = null; 
     } 
    }  
} 

然後註冊在App_Browsers文件的PageAdapter類/ all.browser

<browsers> 
    <browser refID="Default"> 
    <controlAdapters> 
     <adapter controlType="System.Web.UI.Page" adapterType="TestPageAdapter" /> 
    </controlAdapters> 
    </browser> 
</browsers> 

將銀行經營的每一個頁面初始化。

+0

@Ishtar:PageAdapters!我必須承認,我已經閱讀了過去的文章,但從未嘗試過。我會確定地看。我會讓你知道它是怎麼回事。 – vmarquez 2009-11-10 18:59:20

+1

@Ishtar,我已經測試過您的解決方案,並且完美地工作。唯一缺少的部分是調用MyBase.OnInit(e)。就我而言,我只是在OnInit覆蓋開始時調用它。謝謝。 – vmarquez 2009-11-14 22:44:00

0

你可以寫從System.Web.UI.Page派生有你在此改變方法

public class CultureBasePage : System.Web.UI.Page 
{ 

protected overide InitializeCulture(object sender, EventArgs e) 
{ 

// set thread culture and ui culture here 

base.InitializeCulture(sender, e); 
} 

} 

然後設置你的頁面從這個類

public class _Default : CultureBasePage {} 

如果您導出自定義類不需要代碼隱藏文件,你也可以在aspx文件中設置:

<%@ Page Language="C#" Inherits="CultureBasePage" %> 
+0

謝謝Ishtar。我已經知道了。我的問題沒有創建自定義類。 – vmarquez 2009-11-09 06:06:40

+0

所以,如果你只想設定文化,你可以這樣做,例如在Application_BeginRequest方法中的global.asax中。您也可以使用頁面的控制適配器,但這不是很好的解決方案。覆蓋頁面方法的另一種方式可能不存在。 – 2009-11-09 06:14:24

+0

@Ishtar:設定文化不是問題。我在Web.config中設置文化。我會更新我的問題,以便更清楚。 – vmarquez 2009-11-09 20:42:57

3

你爲什麼試圖避免從頁面繼承?

你的問題有點自相矛盾......「覆蓋Page_Init」這個短語意味着你試圖避免的繼承。兩個選項:

1)將任務作爲Simon建議在BeginRequest處理程序中執行。 2)創建一個新的HttpHandler來使用而不是Page。你可能能夠封裝一個Page對象,但我不認爲你可以直接調用Page.ProcessRequest,所以這可能毫無意義。

+2

@Bryan:爲什麼只是爲了方便。僅僅爲這個小的需求進行子類化似乎有點太過分了。我將檢查文化是否已經從BeguinRequest的Web.config中加載。它是這種情況,那麼我可以將我的代碼直接放在Global.asax並避免子類化。 – vmarquez 2009-11-09 20:57:39

+0

在這種情況下,您應該創建一個自定義的HttpModule。 Global.asax主要用於傳統支持。 – Bryan 2009-11-09 21:31:12

+0

@Bryan:創建一個自定義的HttpModule是我的最後手段。目前,我已經驗證了自定義文化格式在Global.asax中的Application_BeginRequest中完美工作。 – vmarquez 2009-11-10 18:57:48