在没有子类化页面的情况下全局覆盖Page_PreInit()?

时间:2009-11-09 05:43:20

标签: asp.net override

我觉得有些人看到了一个关于此的例子但又找不到它了:

是否有办法在全局范围内覆盖Page_Init()事件而不创建从Page继承的新MyCustomPage类?

我希望有一些方法可以在没有子类化页面的情况下对页面进行全局覆盖(不需要从子类继承我的页面)。我正在考虑关于Global.asax的一些内容,但是对于Page。

这是我希望在每个页面中在PreInit上运行的代码:

' 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

提前感谢您的时间。

编辑:

截至今天,已有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,他提供了一个初步答案并坚持这个主题,因为我拒绝了我的需求。然后他提供了第二个答案,证明是正确的(标记为已接受的答案)。

3 个答案:

答案 0 :(得分: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 / all.browser

中注册您的PageAdapter类
<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.Page" adapterType="TestPageAdapter" />
    </controlAdapters>
  </browser>  
</browsers>

它将在每个页面init上运行。

答案 1 :(得分:3)

为什么要避免继承自Page?

你的问题有些自相矛盾......短语“覆盖Page_Init”意味着你试图避免的继承。两个选项:

1)在BeginRequest处理程序中执行任务作为Simon建议。 2)创建一个新的HttpHandler来使用而不是Page。您可能能够封装Page对象,但我认为您不能直接调用Page.ProcessRequest,因此这可能毫无意义。

答案 2 :(得分: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" %>