我正在尝试从同一母版页内的用户控件访问母版页内页面的公共属性。我看到的大多数示例都建议我将属性中的值放在页面上的隐藏元素中,并通过获取对母版页的引用并使用某些内容来访问它
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网络应用程序,但不适用于asp.net网站。我正在寻找一个适用于后者的答案。
答案 0 :(得分: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,此“关于”页面有一个名为“PublicProperty as”的公共属性:
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
}
}