2009-02-15 4 views
1

У меня возникла проблема с настраиваемым элементом управления, отображающим его содержимое (дочерние элементы управления) вне тега, что приводит к ошибкам и проблемам времени выполнения. В попытке упростить все, что я могу, я создал элемент управления ниже, но у него такая же проблема. Я пробовал наследовать от Control, WebControl и CompositeControl, что приводит к той же проблеме. Угадай, что есть что-то очевидное, что я делаю неправильно ... Спасибо за любую помощь.asp.net пользовательский контроль рендеринга вне формы тег

using System; 
using System.Web.UI.WebControls; 

namespace MyControls 
{ 
    public class TestControl : CompositeControl 
    { 
     protected override void CreateChildControls() 
     { 
      Controls.Clear(); 
      Controls.Add(new Button() { Text = "TestControl!" }); 
      ClearChildViewState(); 
     } 
    } 
} 

Добавление элемента управления программно приводит к разметке вне тега формы. Добавление контроля с помощью разметки работает правильно.

protected void Page_Load(object sender, EventArgs e) 
{ 
    Controls.Add(new TestControl()); 
} 



... 
<body> 
    <form name="PageForm" method="post" action="default.aspx" id="PageForm"> 
<div> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTE5MDEwMTE5MWRkg0FopdvLhTPGxHkGm1xCCOVQz6A=" /> 
</div> 

    <div> 

    </div> 
    </form> 
</body> 
</html> 
<span><input type="submit" name="ctl04$ctl00" value="TestControl!" /></span> 

ответ

2

Добавление контроля через страницу. Свойство rm отобразит кнопку внутри формы.

Page.Form.Controls.Add(new Button() { Text = "TestControl!" }); 

Однако, поскольку кнопка не содержится в блоке, такие как < div>, вы можете иметь некоторые проблемы компоновки с помощью этой кнопки. Используйте подход ScarletGarden.

+0

Я согласен, что это сработает, но это не очень интуитивно, особенно если кто-то использует этот элемент управления и не знает лучше. Почему другие пользовательские элементы управления не поддерживают этот подход? Controls.Add (новая кнопка()); работает просто отлично. Мой контроль не делает. Что мне не хватает? – andleer

+0

Чаще всего включать элементы управления с помощью декларативной разметки, а затем вручную добавлять элементы управления в ControlCollection. Вы можете связать пространство имен MyControls с префиксом тега, а затем использовать em как: в противном случае дать дополнительную информацию по вашей проблеме – baretta

1

Ваше управление кажется, нормально, я думаю, что у вас есть проблемы с добавлением вашего управления на страницу,

Добавить PlaceHolder на страницу,

<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:PlaceHolder ID="placeHolder" runat="server"></asp:PlaceHolder> 
    </div> 
    </form> 
</body> 

, а затем добавить составной элемент управления к этому собранию контрольных органов этого заполнителя:

TestControl testCtrl = new TestControl(); 
placeHolder.Controls.Add(testCtrl); 
+0

Я думаю, что в теории это будет работать, но это не делает пользовательский контроль очень общей целью. Конечно, не так, как работают другие custome-элементы управления. – andleer

+0

Интересно, как вы добавляете свой контроль на свою страницу? перетаскиваете ли вы теги формы? – Canavar

+0

Извините. Добавляется программно. Прекрасно работает при добавлении в разметку. – andleer

2

Это не имеет никакого отношения к вашему пользовательскому контролю. Ваша проблема связана с тем, как вы добавляете элемент управления на страницу.

При вызове Controls.Add в Page_Load методе вашей страницы, это в основном сокращением для:

Page.Controls.Add(new TestControl()); 

т.е. Вы хотите добавить элемент управления в конце иерархии управления всей вашей страницы. Когда страница отображается, ваш контроль отображается после всех остальных - даже после закрытия тега </html>.

Если вы хотите, чтобы ваш контроль, чтобы быть оказаны в форме, то вам нужно добавить его в иерархии элементов управления формы вместо:

Form.Controls.Add(new TestControl()); 

Если вам нужно еще более мелкозернистую позиционирование, то вам нужно поставить a placeholder (или div или span и т. д.) на вашей странице в нужном месте и добавить к этому свой контроль, как в ответе ScarletGarden.

+0

Ok. Я был определенно в неправильном направлении. Я предположил, что стандартные элементы управления asp.net работают иначе, чем мои, но они имеют ту же проблему при добавлении в коллекцию Page.Controls. Мое плохое предположение. – andleer

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