【问题标题】:How to properly change a page's master page?如何正确更改页面的母版页?
【发布时间】:2013-01-09 12:09:37
【问题描述】:

我的 ASP.NET 应用程序中有两个母版页。一个用于常规使用,另一个用于打印。我使用会话参数来查看应用程序当前是否处于打印模式:

method Global.Application_PreRequestHandlerExecute(src: System.Object; e: EventArgs);
begin
  var p: System.Web.UI.Page := System.Web.UI.Page(self.Context.Handler);
  if p <> nil then begin
    p.PreInit += new EventHandler(page_PreInit)
  end
end;

method Global.page_PreInit(sender: System.Object; e: EventArgs);
begin
  var p: System.Web.UI.Page := System.Web.UI.Page(self.Context.Handler);
  if p <> nil then
    if p.Master <> nil then
    begin
      if Session['P'].ToString = '1' then
        p.MasterPageFile := '~/Print.Master'
      else
        p.MasterPageFile := '~/Site.Master'; 
    end;
end;

我的普通页面上有一个按钮,将Session['P']设置为'1',在我的打印母版页面上有另一个按钮,将Session['P']设置为@987654325 @。现在,我的问题是,在我更改了代码中的会话参数之后,页面是使用过时的母版页呈现的,而不是当前的。用户必须按 F5 才能看到正确的页面。似乎我的page_PreInit() 事件在buttonClick() 之前被触发。那么,我该怎么办?

【问题讨论】:

    标签: asp.net delphi-prism oxygene


    【解决方案1】:

    Page_PreInit 在任何点击事件处理程序之前运行。

    您是否考虑过使用面板或样式表以打印模式呈现您的页面?

    【讨论】:

    • 是的。占用我太多时间
    • 除了使用带有 onClick 事件的按钮外,您始终可以使用带有 QueryString 参数的标准 HTML 控件,例如 print=1 或 print=0。查询字符串在 Page_PreInit 方法的请求对象中可用。然后使用它在 Page_PreInit 方法的开头设置 Session 变量。
    【解决方案2】:

    我终于在我的Page_PreInit 事件中使用了Request.Params['__EVENTTARGET'] 来确定单击的控件是否是负责在正常打印 模式之间切换的按钮。我的代码如下所示:

    S := Request.Params['__EVENTTARGET'];
    if S.Length > 0 then
      S := S.Substring(S.IndexOf('$') + 1);
    if S = 'lbPrint' then
      Session['P'] := '1'
    else if S = 'lbNormal' then
      Session['P'] := '0';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      相关资源
      最近更新 更多