C# 自定义控件发出<;td>;加成周围环境<;tr runat=server>;导致编译错误
我有一个自定义控件,C# 自定义控件发出<;td>;加成周围环境<;tr runat=server>;导致编译错误,c#,html,asp.net,C#,Html,Asp.net,我有一个自定义控件,InputField,它封装了一个标签和一个文本框。控制的内容远不止这些,但详细阐述只会给这个问题增加噪音。它有一个布局属性,该属性有条件地发出标记,这样我就可以避免.aspx文件中的混乱。因此,与其 <table> <tr> <td>Name:</td> <td><asp:TextBox ... /></td> </tr> 姓名: 我会写 <table
InputField
,它封装了一个标签
和一个文本框
。控制的内容远不止这些,但详细阐述只会给这个问题增加噪音。它有一个布局
属性,该属性有条件地发出
<代码>标记,这样我就可以避免.aspx
文件中的混乱。因此,与其
<table>
<tr>
<td>Name:</td>
<td><asp:TextBox ... /></td>
</tr>
姓名:
我会写
<table>
<tr>
<cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>
但是,如果我需要能够在code behind中访问该
,我会得到一个编译错误。标记:
<table>
<tr runat="server" id="tr1">
<cc:InputField Layout="TableCells" FieldLabel="Name:" ... />
</tr>
生成错误:System.Web.UI.HtmlControls.HtmlTableCellCollection必须具有“System.Web.UI.HtmlControls.HtmlTableCell”类型的项cc:InputField的类型为“ASP.customcontrols\u InputField\u ascx”。
我理解产生错误的原因。我正在寻找一种方法来更改我的InputField
控件,这样就不会发生此错误。由于C#没有多重继承,而InputField
是,并且可能必须是System.Web.UI.UserControl
的子类,因此我无法将其更改为子类HtmlTableCell
我尝试了
,然后设置显示:无
,但我因为写了不符合我们编码标准的乱七八糟的代码而被骂
我有没有办法改进我的
InputField
类,使它可以生活在
元素中?我清楚地意识到,正确的答案很可能是“你完全错了。停止编写这样的组件!这就是为什么……”因为这个输入字段
类是你自己设计的,如果你想将它添加到HtmlTableCellCollection
(tr)中,然后,您需要使其从HtmlTableCell
继承,或者需要使用as
,并停止让控件输出td
。真的没有其他选择了
事实上,您可能不应该将
td
作为控制输出的一部分输出,因为这会阻止它在非表上下文中使用。避免编写td
似乎是一件非常头痛的事情。在您的情况下,是否允许只使用CSS和JavaScript隐藏/显示行?@MikeSmithDev它封装了许多其他行为,包括一些验证程序和其他格式选项。就你而言,我正在考虑禁用发出s的功能。@BobKaufman是cc:InputField还是你提供的自定义控件?还是来自第三方库?@BrianShamblen-这就是我现在正在做的,但是其他团队成员不喜欢它。当布局设置为表单元格时,它有条件地发出
元素。还有其他设置,因此它可以作为TableRow、ListItem或不完全包含标记的形式发出。我收到的答案和评论证实了我的怀疑,即我对这个问题采取了不正确的方法。@BobKaufman plus,删除所有有条件添加标记的代码将大大清理您的代码。。。然后让你的标记更有意义。然后下一个家伙不必担心使用什么自定义属性来创建HTML。。。当他能写出HTML的时候。