5

我有一个具有一种属性名称事件类型的母版页。现在我想从内容页面设置此属性,然后该属性值应该可用于另一个内容页面。

这可能与 asp.net 吗?如果是,请帮助我。

是的,我的内容页面已经继承了另一个非主页面。

4

7 回答 7

3

如果此属性是您添加到母版页的自定义属性,那么您必须向MasterType包含它的页面添加声明。

<%@ MasterType 
    virtualpath="~/Path/To/Your.master" 
%>

这允许网站或应用程序在编译时知道母版页的特定类型,并允许您像访问控件中的任何其他属性一样访问它。

Page.Master.MyCustomerProperty = someValue;

编辑:作为旁注,在将此属性下放到您的下一个控件时,最好创建(并引发)一个自定义事件,指示该属性已更改。这样,许多控件可以订阅事件并“自我更新”,而不必关心设置属性的时间。

示例:在您的母版页中,您可以将事件定义为“全局”变量。然后在您的财产中,您可以提出此事件。

public event EventHandler myPropertyChanged;
public delegate void MyPropertyChanged(object sender, EventArgs e);

//...

public string MyProperty
{
    get
    {
       return _myProperty;
    }
    set
    {
        _myProperty = value;
        if (myPropertyChanged != null)
            myPropertyChanged(this, new EventArgs());
    }
}

然后在您的其他控件中,您可以订阅此事件以了解它何时更改:

protected void Page_Load(object sender, EventArgs e) 
{
    Page.Master.MyPropertyChanged += new EventHandler(MasterPropertyChanged);
}

protected void MasterPropertyChanged(object sender, EventArgs e) 
    //Rememeber you need the VirtualType in order for this event to be recognized
    SomeLocalValue = Page.Master.MyProperty;
}

可以在CodeProject上找到有关此过程的良好分步教程。可以在MSDN上找到一个很好的 c# 自定义事件教程。

于 2013-03-15T12:01:52.140 回答
2

如果您的页面来自不同的请求,则主属性将不起作用。母版页不是静态的,每个请求都有一个不同的页面,这意味着您设置值的实例在您尝试检索它时已经消失。Session字典是您应该放置要在请求之间保留的用户内容的地方。

于 2013-03-15T22:02:05.670 回答
2

向母版页添加属性:

public string lblBannerText { get { return lblBanner.Text; } set { lblBanner.Text = value; } }

然后,获取页面的 master 并将其转换为 master 类类型:

((MyMaster)Page.Master).lblBannerText = "banner text";
于 2015-03-03T15:30:57.140 回答
0

获取或设置 MasterPage 属性的简单方法,就像 this.in 内容页面一样,请执行以下操作。

protected override void Render(HtmlTextWriter writer)
{
    var master = this.Master as Site;
    master.SiteName += "|网站首页";
    base.Render(writer);
}

并在母版页中定义属性

public partial class Site : System.Web.UI.MasterPage
{
    public string MetaDescription { get; set; }
    public string MetaKeywords { get; set; }
    public string SiteName { get; set; }
    public SiteSettings siteSettings { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        siteSettings = SettingsFactory<SiteSettings>.Get();
        MetaDescription = siteSettings.SearchMetaDescription;
        MetaKeywords = siteSettings.SearchMetaKeywords;
        SiteName = siteSettings.SiteName;
    }
}
于 2014-04-21T08:38:32.693 回答
0

您可以使用Master property您的页面并访问您的财产

链接:http: //msdn.microsoft.com/fr-fr/library/system.web.ui.page.master.aspx

样本

ContentPlaceHolder mpContentPlaceHolder;
    TextBox mpTextBox;
    mpContentPlaceHolder = 
      (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
    if(mpContentPlaceHolder != null)
    {
        mpTextBox = 
            (TextBox) mpContentPlaceHolder.FindControl("TextBox1");
        if(mpTextBox != null)
        {
            mpTextBox.Text = "TextBox found!";
        }
    }
于 2013-03-15T11:55:22.150 回答
0

你可以试试这个

在母版页中创建一个属性,然后从内容页访问它:

母版页:

public partial class BasePage : System.Web.UI.MasterPage
{ 
   private string[] _RequiredRoles = null;

   public string[] RequiredRoles
   {
     get { return _RequiredRoles; }
     set { _RequiredRoles = value; }
   }
 }

内容页:

 public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load()
  {
    Master.RequiredRoles = new string[] { //set appropriate roles };
   }
 }
于 2013-03-15T11:56:55.850 回答
0

我有一个类似的问题。这是我所做的:

//Id the form tag and place a runat server
  <form id="form1" runat="server" >

//In C# Masterpage.cs - Expose the forms properties
 public System.Web.UI.HtmlControls.HtmlForm Form1 {
            get { return form1; }
            set { form1 = value;
            } }
//In C# Consuming page add this to pageLoad using UniqueId
 ((SiteMaster)Page.Master).Form1.DefaultButton = btnSearchUsersLink.UniqueID;
于 2018-03-30T13:20:14.050 回答