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 基本上为您提供“后期绑定”,即“在运行时找出方法”,而不是编译器为您找出方法的“早期绑定”。

从这个答案

我想知道,考虑其他解决方案。考虑到性能、安全性、类型安全等,第二种方式仍然是实现这一目标的劣势方法吗?

编辑:Icarus的答案适用于 asp..net Web 应用程序,但不适用于 asp.net 网站。我正在寻找一个适用于后者的答案。

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" />

假设您有另一个页面,名为“About”,它使用此 Site.Master,并且此“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 回答