自定义控件发出标记。周围原因编译错误

时间:2013-12-06 16:05:54

标签: c# html asp.net

我有一个自定义控件InputField,它封装了LabelTextBox。对比控制更多,但精心设计只会给这个问题增加噪音。它具有Layout属性,有条件地发出<td> ... </td>标记,因此我可以避免在.aspx文件中出现混乱。所以,而不是

<table>
<tr>
    <td>Name:</td>
    <td><asp:TextBox ... /></td>
</tr>

我可以写

<table>
<tr>
    <cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>

但是,如果我需要能够在后面的代码中访问<tr>,我会收到编译错误。标记:

<table>
<tr runat="server" id="tr1">
    <cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>

生成错误:System.Web.UI.HtmlControls.HtmlTableCellCollection must have items of type 'System.Web.UI.HtmlControls.HtmlTableCell'. 'cc:InputField' is of type 'ASP.customcontrols_inputfield_ascx'.

我理解为什么正在生成错误。我正在寻找的是一种更改InputField控件的方法,因此不会发生此错误。由于C#没有多重继承,并且InputField可能是System.Web.UI.UserControl的子类,因此我无法将其更改为子类HtmlTableCell

我尝试<tr id="tr1">然后设置display: none但是我因为编写了不符合我们编码标准的kludgy代码而大喊大叫。

我有没有办法改进我的InputField课程,以便它可以在<tr runat="server">元素中生活?我敏锐地意识到正确的答案很可能是“你完全错了。停止写这样的组件!这就是为什么......”

1 个答案:

答案 0 :(得分:1)

由于此InputField类是您自己设计的,如果您想将其添加到HtmlTableCellCollection(tr),那么您需要将其从HtmlTableCell继承,或者您需要使用<td><cc:InputField... /></td>,并停止让控件输出td。确实没有其他选择。

事实上,您可能不应该将td作为控件输出的一部分输出,因为这会阻止它在非表上下文中使用。