2012-06-08 75 views
0

我想从同一主页面内的用户控件访问母版页内的页面的公共属性。大部分我所看到的例子建议我把从该属性的值在页面上隐藏的元素,并通过获取到母版页的参考和使用的东西沿着从母版页中的用户控件访问页面公共属性

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

或以其他方式把线访问cookie中的值,URL等,并从用户控件中读取。

但是我能够

CallByBame获得使用

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 

由于我的解决方案适用的价值基本上是给你“后期绑定”,这是“在游程搞清楚 方法时间“,而不是”早期绑定“,编译器会在这里为你解决这个问题。

from this answer

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

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

回答

0

如果我理解正确,则根本不需要使用反射。你应该能够做这样的事情在你的控制(C#,不好意思):

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

UPDATE:提供了一个简单的例子。

的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而这个“关于”页面有一个名为“公物作为这么公共财产:

现在
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 
     } 
} 
+0

伊卡洛斯您好,感谢您的答复我TR ied复制您的解决方案,但我无法从用户控件访问About对象。你是如何完成这个的?没有必要对使用C#感到抱歉,我精通这两种语言:) – alykhalid

+0

它对我来说工作得很好,它应该适合你。如果您将项目创建为“网站”,而不是创建类型为ASP.NET的常规项目,则可能无法实现此功能。 – Icarus

+0

嗨伊卡洛斯,你说得对,我应该在我的问题上更加清楚。我正在构建一个asp.net网站,而不是一个Web应用程序。 – alykhalid

相关问题