2012-05-07 5 views
6

У меня есть главная страница, и все мои страницы наследуют ее. Для форматирования я решил разместить в ContentPlaceHolder контент, который отличается от одной страницы другой.Как программно добавить материал в contentPlaceHolder?

Теперь, как я могу вставить все в это? Поскольку я планирую заполнять ContentPlaceHolder материалами из базы данных, я полагаю, что мне придется делать это программно.

  1. Как добавить элементы управления к держателю ContentPlace? Я проверил другое answers, но я не могу получить к нему доступ по его ID.

  2. Должен ли я использовать несколько ContentPlaceHolders с самого начала? Скажем, я хочу поставить фильмы. Должен ли быть только один со всеми изображениями, описаниями и рейтингами, рубить один ContentPlaceHolder для каждой вещи?

Я открыт для других решений, поскольку у меня нет опыта работы с ASP.

ответ

2

Что обычно происходит,

  1. вы создали свои главные страницы с правильным HTML и ContentPlaceHolder s
  2. создавать страницы на основе от этой главной страницы. Если вы используете Visual Studio и говорите ему, чтобы создать новую страницу на основе существующей главной страницы, она добавит вам области Content.
  3. вы добавляете вещи в области содержимого на вновь созданной странице.

Если вы хотите динамически добавлять элементы управления на главную (или любую) страницу, вы можете добавить элементы управления к любому существующему элементу управления. Если это не должно быть обернуто каким-либо образом, просто добавьте Placeholder (это элемент управления asp.net).

+0

Извините, это на самом деле не решает мою проблему. Мне нужен код для программного ввода, скажем, некоторого текста, в эту область содержимого, потому что я не могу получить к нему доступ с CodeBehind на веб-странице. У меня есть страница default.aspx и ContentPlaceHolder с ID = content1. В default.aspx.cs я не могу «видеть» content1. –

+0

Я вижу. Есть ли причина, по которой вы не можете поместить местозаполнитель в область «Содержимое» вашей страницы? Вы, безусловно, можете добавить к этому вещи: – JayC

+0

Например: 'Label lbl = new Label(); lbl.Text = "что-то"; placeHolder.Controls.Add (lbl); ' – JayC

1

Я сделал, как этот

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
<asp:Literal ID="jsstuff" runat="server"></asp:Literal> 
</asp:Content> 

И это пошло в код позади:

string stuff = @"<script type=""text/javascript""> 
             var searchBox = 0; 
             var currentCountry = ''; 
             </script>"; 
        jsstuff.Text = stuff; 
10

Старый вопрос ... но я столкнулся с этим вопросом, и это было # 1 пост, который хранится в Google, поэтому я добавлю свой ответ, поскольку другие не работали в моем случае.

Вот как я это сделал, когда обычный <asp:Content не будет работать (хотя при нормальном использовании, ответ @JayC как вы это делаете):

MasterPage имеет этот ContentPlaceHolder:

<asp:ContentPlaceHolder ID="ScriptsPlace" runat="server"></asp:ContentPlaceHolder> 

Пришлось динамически добавлять JavaScript из пользовательского элемента управления. Попытка использовать ContentPlaceHolder непосредственно дает эту ошибку:

Parser Error Message: Content controls have to be top-level controls in a content page or a nested master page that references a master page.

Так что я хотел бы добавить скрипт из отделенного кода.Вот загрузки страницы для файла .ascx:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder; 
    if (c != null) 
    { 
     LiteralControl l = new LiteralControl(); 
     l.Text="<script type=\"text/javascript\">$(document).ready(function() {js stuff;});</script>"; 
     c.Controls.Add(l); 
    } 
} 

UPDATE: Так получается, что я должен был использовать это в большем количестве мест, чем я ожидал, и в конечном итоге, используя способ, который был гораздо более гибким/читаемым , В самом пользовательском элементе я просто завернул javascript и все остальное, что нужно было перемещать с помощью обычного div.

<div id="_jsDiv" runat="server"> 
    $(document).ready(function() { 
     //js stuff 
    }); 
    Other server controls or HTML junk 
</div> 

И тогда код позади обнаружит, что DIV, а затем переместить его в ContentPlaceHolder.

protected void Page_Load(object sender, EventArgs e) 
{ 
    ContentPlaceHolder c = Page.Master.FindControl("ScriptsPlace") as ContentPlaceHolder; 
    HtmlGenericCOntrol jsDiv = this.FindControl("_jsDiv") as HtmlGenericControl; 
    if (c != null && jsDiv != null) 
    { 
     c.Controls.Add(jsDiv); 
    } 
} 

Я на самом деле поместить этот код в элементе управления пользовательского пользователя, и я просто мои обычные пользовательские элементы управления наследуют от пользовательского элемента управления пользователя, поэтому, когда я обернуть JavaScript/и т.д. с <div id="_jsDiv" runat="server">, контроль пользовательских пользователь принимает забота об остальном, и мне не нужно ничего делать в коде управления пользовательского элемента управления.

+0

Это работает блестяще. Это может быть даже расширено, чтобы включить параметр управления для имени заполнителя. Я использовал это решение, когда мне нужно было программно разместить javascript-файл в определенной последовательности/позиции, а не в заголовке. – secretwep

0

Если пространство имен для страницы содержания и главной страницы не является таким же, то элемент управления страницы содержимого недоступен в Codebehind на странице содержимого.

Также проверьте свои файлы дизайнеров. если элемент управления не указан в файле конструктора, тогда удалите файл и заново создайте (проект-> конвертировать в веб-приложение)

Смежные вопросы