熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

關於使用basepage進行驗證的問題

2013-11-13 09:42:21  來源: .NET編程 

  在 (fx)中采用了和 (fx)不同的編譯模型在fxPage_Load事件的掛接是寫在CodeBehind的代碼中的到了fx采用了partial關鍵字後估計是編譯器自動產生了代碼再和codefile中的代碼合並

  fx的編譯模式在大多數情況下效果不錯代碼文件也變得更簡潔了但一旦使用頁面繼承時問題就出來了

  在fx可以寫如下代碼

  public class BasePage:Page

  {

  override protected void OnInit(EventArgs e)

  {

  InitializeComponent();

  baseOnInit(e);

  }

  private void InitializeComponent()

  {

  thisLoad += new SystemEventHandler(thisMy_Page_Load);

  }

  protected void My_Page_Load(object sender EventArgs e)

  {

  // do somthing public

  PageLoadEvent(sendere);

  }

  protected virtual void PageLoadEvent(object sender EventArgs e) { }

  }

  public class FooPage:BasePage

  {

  protected void Page_Load(object sender EventArgs e)

  {

  }

  protected override void PageLoadEvent(object sender EventArgs e)

  {

  // do something here

  }

  }

  在fx這麼寫沒什麼問題FooPage中的Page_Load不會被執行一切都很正常

  但在fx首先我不能自己掛接Page_Load事件了因為編譯器接管這事了如果想實現fx中的類似功能只能這麼寫了

  public class BasePage:Page

  {

  protected void Page_Load(object sender EventArgs e)

  {

  // do somthing public

  PageLoadEvent(sendere);

  }

  protected virtual void PageLoadEvent(object sender EventArgs e) { }

  }

  public class FooPage:BasePage

  {

  protected void Page_Load(object sender EventArgs e)

  {

  }

  protected override void PageLoadEvent(object sender EventArgs e)

  {

  // do something here

  }

  }

  在的代碼中必須寫Page_Load這樣才會被編譯器自動掛接沒法自定義了這倒不是什麼問題只需遵守的規矩好了但在FooPage中就出問題了在FooPage中一旦寫了Page_Load就會覆蓋BasePage中的Page_Load而編譯器只會發出warning說FooPage中的Page_Load隱藏了BasePage中的Page_Load這樣的繼承是很危險的子類的設計者很可能在不經意間覆蓋了父類的邏輯在這個例子中一旦FooPage中定義了Page_Load那麼在PageLoadEvent就不會被執行了(假設FooPage的設計者並不是BasePage的設計者)

  有可能在中有選項使得與完全兼容但我試了一下發現不管怎麼改只要在代碼中有Page_Load編譯器鐵定會掛接Page_Load事件

  解決方法

  在其他的方法中進行驗證

  virtual protected void PageLoadEvent( object sender SystemEventArgs e )

  {

  }

  protected override void OnPreInit( EventArgs e )

  {

  ValidateSession();

  baseOnPreInit( e );

  }

  /// <summary>

  /// 驗證用戶信息

  /// </summary>

  public void ValidateSession()

  {

  //如果後台管理界面超時

  if (HttpContextCurrentSession[UserId] == null || stringIsNullOrEmpty(HttpContextCurrentSession[UserId]ToString()))

  {

  ResponseWrite(<script>alert(登錄狀態過期請重新登錄);topwindowlocation=/admin/loginaspx;</script>);

  HttpContextCurrentResponseEnd();

  return;

  //ResponseRedirect(~/admin/loginaspxtrue);

  }

  }


From:http://tw.wingwit.com/Article/program/net/201311/11373.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.