2012-02-06 55 views
1

我有一个最初从MastePage.master继承的页面。我想在我的项目的其他地方使用相同的页面,但使用不同的主页(MasterPage2.master)。为此,我使用下面的代码。动态更改asp内容标签的MasterPage和ContentPlaceHolderID?

private void Page_PreInit(object sender, EventArgs e) 
    { 
     if (Request.QueryString["Update"].ToString() == "New") 
     { 
      this.MasterPageFile = "MasterPage2.master"; 
      Content con = new Content(); 
      con = (Content)this.FindControl("Content1"); 
      this.Content1.ContentPlaceHolderID = "ContentPlaceHolder2"; 
     } 
    } 

我也试图将ASP内容标签的ContentPlaceHolderID设置为ContentPlaceHolder2这是从MasterPage2.master。最初它是ContentPlaceHolder1。

但我在con =(内容)this.FindControl(“Content1”);

感谢

+0

顺便提一下,页面不会从主页面“继承”。他们有一个基本类型,他们已经从中继承。他们只需引用母版页并在其中进行渲染。 – 2012-02-06 16:50:32

+0

那么如何引用相同的页面以使用不同的母版页来获取像这样的错误---在母版页“MasterPage2”中找不到ContentPlaceHolder'ContentPlaceHolder1'。master“,请在内容页面中验证内容控件的ContentPlaceHolderID属性。 – Tiger 2012-02-06 16:56:12

回答

0

您可以动态地改变母版页在运行时,但你需要使用相同的ContentPlaceHolder的ID。这样,您的页面就可以与主页面一起工作,而无需在运行时添加额外的代码来更改ID。

private void Page_PreInit(object sender, EventArgs e) 
{ 
    if (Request.QueryString["Update"].ToString() == "New") 
    { 
     this.MasterPageFile = "MasterPage2.master"; 
    } 
} 

你甚至可以测试你的页面将与任一母版页在Visual Studio的设计/标记鉴于在.aspx标记在<% Page %>指令改变MasterPageFile工作。

2

页面内部存储在私人'_contentTemplateCollection'哈希表。它使用ContentPlaceHolderID属性作为关键字并将特殊类(将用于构建/初始化内容标记)作为值 - 因此,要更改ContentPlaceHolderID值(在标记内定义),需要修改此哈希表,删除与旧链接的旧条目并添加其他条目与新的ID - 您需要更改ContentPlaceHolderId创建母版页之前,否则将在运行时抛出一个异常 - 最好的地方来改变Ids是Page'preinit'事件,如果更好之前更改Ids母版页(如果你在运行时更改母版页)

要更改内容标签的ContentPlaceHolderID,你可以在页面PreInit事件中使用下面的函数

public static void AssignContentToNewPlaceHoldersWithinPage(Page pPage, string pOldId, string pNewId) 
{ 
    if (pPage == null || string.IsNullOrEmpty(pOldId) || string.IsNullOrEmpty(pNewId)) 
    { 
     return; 
    } 
    // Try to get a reference to private hashtable using fasterflect free reflection library in codeplex (http://fasterflect.codeplex.com/) 
    // you can replace following line with standard reflection APIs 
    var lTmpObj = pPage.TryGetFieldValue("_contentTemplateCollection"); 
    if (lTmpObj != null && lTmpObj is Hashtable) 
    { 
     var _contentTemplateCollection = lTmpObj as Hashtable; 

     if (_contentTemplateCollection.ContainsKey(pOldId) && !_contentTemplateCollection.ContainsKey(pNewId)) 
     { 
      var lTemplate = _contentTemplateCollection[pOldId]; 
      _contentTemplateCollection.Add(pNewId, lTemplate); 
      _contentTemplateCollection.Remove(pOldId); 
     } 

    } 
} 
  • 函数参数是
  • PPAGE是参照页面实例包含内容的标签
  • pOldId是标记ContentPlaceHolderID属性与价值 - 标识要更改
  • pNewId是要使用新的ID

我希望我的回答将是有益的,我很抱歉,如果我的英语不是很好

0

通过覆盖OnPreInit可以更改主页面。

protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 
    MasterPageFile = "~/MasterPages/MyOther.Master"; 
} 

但是对于ContentPlaceHolders我会建议在这两个你MasterPages同名创建新ContentPlaceHolders。