我想我曾经看到过一个关于这个的例子,但再也找不到了:

有没有办法在全局基础上覆盖 Page_Init() 事件而不创建从 Page 继承的新 MyCustomPage 类?

我希望有某种方法可以在不继承 Page 的情况下对 Page 进行全局覆盖(无需从子类继承我的页面)。我正在考虑有关 Global.asax 行的事情,但对于佩奇。

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

' 将 es-MX 的 Culture 的 ShortDate 更改为“dd/mmm/yyyy”。
如果 CultureInfo.CurrentCulture.Name = "es-MX"那么
Dim info As CultureInfo = CultureInfo.CurrentCulture.Clone
info.DateTimeFormat.ShortDatePattern = "dd/MMM/yyyy"
System.Threading.Thread.CurrentThread.CurrentCulture = 信息
信息 = 没有
万一

在此先感谢您的时间。

编辑:

截至今天,下面提供了 2 个非常好的解决方案(就我而言)。我选择了其中一个作为接受的答案,即使我目前将使用其他解决方案。这是因为我将使用的那个是@Simon 对这个问题的评论。

解决方案是将我的代码放在 Global.asax 中:

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

' 将 ShortDatePattern 配置为 es-MX 的“dd/MMM/yyyy”,以避免在两者都是数字时出现月日混淆。
如果 CultureInfo.CurrentCulture.Name = "es-MX"那么
Dim oCultureInfo As CultureInfo = CultureInfo.CurrentCulture.Clone
oCultureInfo.DateTimeFormat.ShortDatePattern = "dd/MMM/yyyy"
System.Threading.Thread.CurrentThread.CurrentCulture = oCultureInfo
oCultureInfo = 无
万一

结束子

在我的问题中,我询问了如何在不对 Page 进行子类化的情况下覆盖 Page_Init()。这似乎引起了一些困惑。原因是我正在创建一个项目模板,其中包含许多通常需要的功能(如用户管理、权限管理等)。

对于使用此模板创建的项目,我想默认为 es-MX Culture 并修改 ShortDatePattern 以在缩写的月份名称中显示月份。由于这是一个项目模板,我希望我的程序员无需实现从自定义类继承的页面。在这个(项目模板)级别为页面强加子类对我来说只是感觉“奇怪”。

另一种解决方案。我标记为接受的那个是由@Ishtar 提供的。我已经实现了它,它运行良好并且符合我的需求。他提供的示例代码中唯一缺少的是需要调用 MyBase.OnInit(e)。

我要感谢所有提供解决方案和评论的人,并特别感谢@Ishtar,他提供了初步答案并坚持了这个主题,因为我因需要拒绝了它。然后他提供了第二个证明正确的答案(标记为已接受的答案)。

最佳答案

另一种方法是使用页面适配器

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 上运行。

关于asp.net - 全局覆盖 Page_PreInit() 而不子类化 Page?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1699272/

10-12 17:57