2011-06-30 25 views
0

System.Web.Ui.Pageから継承するBasePageクラスを作成しました。その基本クラスには、ページが安全かどうかをチェックするboolプロパティがあります。最初は(基本クラスの)PreInitイベントにコードを挿入しましたが、それについて考えると、派生したページはPreInitの前にbool値を設定できません。私はdervciedページのPreInitの値を設定し、その基本クラスのPageInitの値をチェックすることを考えましたが、派生ページでPreInitを使用する必要がある場合はどうしますか?System.Web.Ui.Pageはページイベントを拡張できる派生クラスですか?

私は部分的なメソッドを使うことを考えましたが、ページイベントがSystem.Web.Ui.Pageの部分的なものではないので、私はそれを行うことはできません。

My BasePageクラスは、ところで抽象クラスです。

これは私が(私はこれをテストし、それが動作する可能性を想定していない)今持っているものです。

public abstract partial class BasePage: System.Web.UI.Page 
{ 
    public bool IsSecure { get; set; } 

    protected void Page_Init(object sender, EventArgs e) 
     { 
      if (!IsSecure) return; 
      if (PageMaster == null) 
       return; 
      if (!PageMaster.IsUserLoggedIn) 
      { 
       HttpContext.Current.Response.Redirect("~/WebForms/LogIn.aspx"); 
      } 
     } 
} 


public partial class _Default : BasePage 
{ 
    protected void Page_PreInit(object sender, EventArgs e) 
    { 
    IsSecure = true; 
    } 

} 
+0

あなたの考えは正しいです。私はどこに問題があったのか分かりません。擬似コードの例ができますか? – Bazzz

+0

「ページが安全かどうか」と言うとどういう意味ですか?ユーザーに表示する権限があるかどうか –

+0

@アンダーファインドスタッド - はい、ユーザーのセキュリティ上の理由からです。私たちには特別な必要性があります。 – DDiVita

答えて

2

より良い解決策は、あなたのベースクラスでのOnInitメソッドをオーバーライドすることであってもよいです。イベントが発生する前にセキュアチェックが実行された状態で、ページ内のinitイベントを処理できるようになりました。

ので:

public abstract partial class BasePage: System.Web.UI.Page 
{ 
    public bool IsSecure { get; set; } 

    protected override void OnInit(EventArgs e) 
    { 
     if (!IsSecure) return; 
     if (PageMaster == null) 
      return; 
     if (!PageMaster.IsUserLoggedIn) 
     { 
      HttpContext.Current.Response.Redirect("~/WebForms/LogIn.aspx"); 
     } 

     base.OnInit(e) 
    } 
} 

public partial class _Default : BasePage 
{ 
    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     IsSecure = true; 
    } 

} 
+0

yep !!!これは私が4人で見つけたものです。私が必要とするものでなければならない。 – DDiVita

0

なぜそのように早くあなたが取得するつもりだとして、ConstructorであなたのisSecureを設定していません?

ちょうどそれが好きな定義:

public _Default() 
{ 
IsSecure = true; 
} 
+0

それには何も問題はありませんが、アプリケーションロジックがコンストラクタに埋め込まれているのが好きではありません。コンストラクターはすばやく軽量でなければなりません。ページライフサイクルイベントにチェックを組み込む方が良いでしょう。 –

+0

プロパティを設定するだけで、かなり軽量だと思います。 –

+0

私は、コンストラクタ内のロジックの使用を避けたかったのです。私はそれについて考えました。 – DDiVita

1

私はあなたがIsSecureプロパティの要約を作る(読み取り専用)および派生ページは、それを実装してい示唆しています。プロパティーの値を決定するロジックは、プロパティーのゲッターに含まれています。 BasePage

_Defaultなどで

protected abstract bool IsSecure { get; } 

:あなたのコードは大丈夫です

protected override bool IsSecure 
{ 
    get { // return true or false depending on some condition } 
} 
0

あなたがPageInitを拡張できるようにしたい場合は、単に派生でベースをオーバーライドし、呼び出しますクラス。

public partial class _Default : BasePage 
{ 
    protected override void Page_Init(object sender, EventArgs e) 
    { 
     base.Page_Init(sender, e); 
     //more code here 
    } 
} 
関連する問題