td风格在中继器赢得';t输出绑定值(“这不是scriptlet.将以纯文本形式输出”)
本文关键字:输出 这不是 scriptlet 文本 中继器 风格 绑定 td | 更新日期: 2023-09-27 18:28:59
我有一个中继器,里面有一个表,里面有中继器绑定的td的很多属性。我不得不为每个td添加一个runat服务器,这样我就可以添加一个可见的属性,因为根据数据的不同,一些td是不可见的。
现在我已经添加了runat服务器,我在设置tds的背景颜色时遇到了问题。它是用一个绑定值完成的。当我添加我的<%%>标记到我的风格,它们被输出为纯文本,它甚至在我的html中说"这不是一个scriptlet。将以纯文本输出",而我的<%%>标签绑定正确。
为什么我的风格不再流行了?
我添加的其他标签会,但不是样式?
这是我中继器的精简版。
<table id="Table1" border="1" cellpadding="0" cellspacing="0" class="groups">
<tr id="Tr1" class="thead">
<td colspan='<%#AllowedItems.Count() %>' align="center">
items
</td>
</tr>
<tr class="theadL">
<td id="Td1" runat="server" visible='<%#ItemAllowed("Item1")%>'>
item1
</td>
<td id="Td2" runat="server" visible='<%#ItemAllowed("Item2")%>'>
item2
</td>
<td id="Td3" runat="server" visible='<%#ItemAllowed("Item3")%>'>
item 3
</td>
</tr>
<asp:Repeater ID="Repeater1" runat="server" DataSource='<%# GetData((int)Eval("Id"))%>'>
<ItemTemplate>
<tr>
<td id="Td9" title='<%#Eval("Item1Status")%>' runat="server" visible='<%#ItemAllowed("Item1")%>'
style='background-color: <%#Eval("Item1StatusColour")%>;'>
</td>
<td id="Td10" title='<%#Eval("Item2Status")%>' runat="server" visible='<%#ItemAllowed("Item3")%>'
style='background-color: <%#Eval("Item3StatusColour")%>;'>
</td>
<td id="Td11" title='<%#Eval("Item3Status")%>' runat="server" visible='<%#ItemAllowed("Item4")%>'
style='background-color: <%#Eval("Item4StatusColour")%>;'>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
更新
样式渲染如下:
style="background-color:<%# ""+ Eval("Item1StatusColour")%>;"
该属性的所有其余部分都以其应有的方式进行渲染。
更新这是请求的ItemAllowed方法
public bool ItemAllowed(string item)
{
//allowed items is a list<string>
return AllowedItems.Contains(item);
}
我建议的第一件事是使用css类,而不是您正在做的事情。
当您在runat=server中使用html元素时,您将其转换为html控件,.net将呈现最终输出。您的特殊问题源于.net用htmlencode或类似的东西包装值。
我建议使用带有onrowdatabound事件的gridview。然后,您可以在后面的代码中进行任何编程。
我认为它不喜欢代码和内联字符串的组合,所以你可以尝试在代码中完成这一切:
<td ... style='<%# "background-color:" + Eval("Item2StatusColour")%>'>
不幸的是,我面前没有VS,所以无法验证,请告诉我它是否有效。
如果您的控件在服务器上运行,我个人建议挂接中继器中的OnItemDataBound
事件,然后在代码后台处理那里的所有计算。以下是的一个快速示例
ASPX
...
<asp:Repeater ID="rptItems" runat="server" OnItemDataBound="rptItems_OnItemDataBound" DataSource='<%# GetData((int)Eval("Id"))%>'>
<ItemTemplate>
<tr>
<td id="Td9" runat="server"></td>
<td id="Td10" runat="server"></td>
<td id="Td11" runat="server"></td>
</tr>
</ItemTemplate>
</asp:Repeater>
...
代码隐藏
protected void rptItems_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType != ListItemType.AlternatingItem && e.Item.ItemType != ListItemType.Item)
{
return;
}
var currentItem = e.Item as YourDataItemTypeHere;
var td9 = e.Item.FindControl("Td9") as HtmlTableCell;
td9.Attributes["title"] = currentItem.Item1Status;
td9.Style["background-color"] = currentItem.Item2StatusColour;
...
}
附带说明
从更可读的角度来看,我还建议将控件重命名为更可读的内容,即什么是td9
、td10
和td11
?相反,如果是tdFirstStatus
、tdSecondStatus
和tdThirdStatus
,会更容易理解,但这只是一个偏好。
刚刚注意到我的答案和克里斯帕罗特爵士的完全一样!然而,我已经对此进行了测试,并在Visual Studio 2008中复制了错误和修复程序…
像这样。。。
<td id="Td9" title='<%#Eval("Item1Status")%>'
runat="server"
visible='<%#ItemAllowed("Item2")%>'
style='<%# "background-color:" + Eval("Item2StatusColour")%>' >
我相信Eval
需要的是数据项名称,而不是表达式。但是,<%# %>
需要一个可以包含运算的表达式。然后可以在这里使用CCD_ 10并且将其连接到串CCD_。
我并没有完全浏览所有的asp内联标签——它们总是让人头疼!
PS-我注意到你的<td>
中的物品编号不匹配-这是故意的吗?例如项目1和项目2在相同的CCD_ 13内被引用。。。