0

2 つのマスター ページを使用するアプリケーションがあります。1 つはメイン ページ用、もう 1 つはポップアップ ページ用です。これらは両方ともマスターページから継承します

public partial class MainMasterPage : System.Web.UI.MasterPage
{

    UserBO objUser = null;

    public UserBO GetCurrentUser()
    {
        UserBO userBO = new UserBO();
     .....
     .....  
        return userBO;
    }
 }


public partial class PopupMasterPage : System.Web.UI.MasterPage
{

    UserBO objUser = null;

    public UserBO GetCurrentUser()
    {
        UserBO userBO = new UserBO();
     .....
     .....  
        return userBO;
    }
 }

ここまでは順調ですね。だから私のコンテンツページはすべて基本クラスから継承します。基本クラスには、基本クラスから GetCurrentUser を呼び出すメソッドがあります。

public class BasePage : Page
{
//..... 
    protected UserBO GetCurrentUserFromMasterPage()
    {
        this.Master
        Elsa.MasterPages.MainMasterPage master = (Elsa.MasterPages.MainMasterPage )this.Master;
        return master.GetCurrentUser();
    }
}

ここで、ベース ページが をキャストしてMasterPageから を呼び出すことがわかりますGetCurrentUser

背景として...マスターページは現在のユーザーがシステムにログインし、情報を使用して自分自身を描画します。ユーザーがセッションに参加している場合は、それを取得します。それ以外の場合は、データベースからロードします。コンテンツ ページに同じことをさせたくないので、ベース ページが常にマスターからコンテンツ ページの現在のユーザーを取得するようにしました。

ただし、私の問題は、2 つのマスター ページがあり、すべての Web ページがベース ページから派生しているためです。正しいマスターにキャストできる必要があります。

public partial class MyMainPage : Elsa.Pages.BasePage
{
    private long _userId = -1;

public partial class MyPopupPage : Elsa.Pages.BasePage
{
    private long _userId = -1;

MasterType ディレクティブを挿入すると、正しいマスターのコンテンツ ページでメソッドを呼び出すことができます。しかし、共通のメソッドとしてコンテンツから呼び出したくないので、ベースで必要です。

誰でもこれを処理する方法を知っています。PopupBasePage の BasePage を再度派生GetCurrentUserFromMasterPage()させ、ポップアップ マスターにキャストするように上書きすることを考えていました。または、何にキャストするかを伝えるために、BasePage コンストラクターに何かを渡しますか。

多くの Web ページがあるため、すべての Web ページへの影響を最小限に抑えたいと考えています。

ありがとうM

4

3 に答える 3

2

追加の MasterPage を、現在の 2 つのクラスの基本クラスとして挿入できます。

public partial class SiteMasterPage : System.Web.UI.MasterPage
{
   ....
   // GetCurrentUser
}

public partial class MainMasterPage : SiteMasterPage
{
   ....
}

public partial class PopupMasterPage : SiteMasterPage
{
}

これにより、他の一般的な機能とマークアップ (CSS ファイルのインクルード) を 1 か所に実装することもできます。

于 2013-07-23T08:30:05.877 に答える
0

これを行う :-

    public class MasterPageBase : MasterPage
    {

    public PageBase PageBase { get { return (PageBase)this.Page; } }

    }

    public class PageBase : Page
    {
      // Do your Extensions Here.. 
    }

PageBase から継承した後にそこにあるすべてのページ。

于 2013-07-23T09:48:35.663 に答える
0

それはあなたにとって理にかなっていますか

リフレクションの使用:

Master.GetType().GetMethod("GetCurrentUser").Invoke();
于 2013-07-23T08:29:17.510 に答える