0

同じマスター ページ内にあるユーザー コントロールから、マスター ページ内のページのパブリック プロパティにアクセスしようとしています。私が見たほとんどの例では、プロパティの値をページの隠し要素に配置し、マスター ページへの参照を取得し、それに沿って何かを使用してアクセスすることを推奨しています。

Dim mstr As MasterPage = Page.Master
Dim element = mstr.FindControl("hiddenField1"), HiddenField)

または、Cookie、URL などに値を入れて、ユーザー コントロールから読み取ります。

しかし、私は値を取得することができました

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Dim mstr As MasterPage = Page.Master
    Return CallByName(mstr.Page, "ProductCounter", [Get])
End Sub

私のソリューションは

CallByBame は基本的に、コンパイラがメソッドを把握する「アーリー バインディング」とは対照的に、「実行時にメソッドを把握する」「レイト バインディング」を提供します。

この回答から

他の解決策を考えて、私は疑問に思っていました。2 番目の方法は、パフォーマンス、セキュリティ、型の安全性などを考慮して、この目標を達成するための劣った方法ですか?

編集: Icarusによる回答は、asp..net Web アプリケーションでは機能しますが、asp.net Web サイトでは機能しません。後でうまくいく答えを探しています。

4

1 に答える 1

0

私の理解が正しければ、リフレクションをまったく使用する必要はありません。コントロールで次のようなことができるはずです(C#、申し訳ありません):

//Assume "MyPage" is the Page inside the MasterPage
MyPage myPage = this.Page as MyPage;
if(myPage!=null)
{
    var publicProperty = myPage.PublicProperty;
}

更新: 単純化された例を提供します。

Site.Master:

<asp:ContentPlaceHolder ID="MainContent" runat="server">        
</asp:ContentPlaceHolder>
<%--this is the user control on the MasterPage--%>
<uc1:WebUserControl1 ID="WebUserControl11" runat="server" />

この Site.Master を使用する「About」という別のページがあり、この「About」ページには「PublicProperty」というパブリック プロパティがあるとします。

public string PublicProperty {
        get { 
            return ViewState["Key"] as string; 
        } 
        set { 
            ViewState["Key"] = value; 
        } 
}

これで、WebUserControl で、たとえば Page_Load でこれを安全に実行できます。

 protected void Page_Load(object sender, EventArgs e)
 {
        About p = this.Page as About;
        if (p != null){
            var prop = p.PublicProperty;
            //Do Something cool with it
        }
 }
于 2012-06-08T15:04:06.380 に答える