2009-11-09 18 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