我有一个带有表格的转发器,其中有许多由转发器绑定的td属性。 我不得不为每个td添加一个runat服务器,所以我可以添加一个visible属性,因为根据数据,一些tds是不可见的。
现在我添加了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);
}
答案 0 :(得分:0)
我认为它不喜欢代码和内联字符串的组合,因此您可以尝试在代码中完成所有操作:
<td ... style='<%# "background-color:" + Eval("Item2StatusColour")%>'>
不幸的是,在我面前没有VS所以无法验证它,让我知道它是否有效。
答案 1 :(得分:0)
注意到我的回答与克里斯帕洛特先生的答案完全相同!不过我测试了这个,我已经在Visual Studio 2008中复制了bug和修复程序......
喜欢这个......
<td id="Td9" title='<%#Eval("Item1Status")%>'
runat="server"
visible='<%#ItemAllowed("Item2")%>'
style='<%# "background-color:" + Eval("Item2StatusColour")%>' >
我相信Eval
期待一个dataitem名称,而不是表达式。但是<%# %>
需要一个可以包含操作的表达式。然后可以在此处使用Eval
并将其连接到字符串"background-color"
。
我没有完全理解所有的asp内联标签 - 它们总是很头疼!
PS - 我注意到<td>
s中的项目编号之间存在不匹配 - 这是故意的吗?例如,Item1和Item2在同一<td>
...
答案 2 :(得分:0)
如果您的控件是runat服务器,我个人建议挂钩转发器中的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
,但这只是偏好。
答案 3 :(得分:0)
我建议的第一件事是使用css类而不是你正在做的事情。
当你使用runat = server的html元素时,你将它转换为html控件,而.net正在渲染最终输出。你的特殊问题来自.net用htmlencode包装值或其他东西。
我建议使用带有onrowdatabound事件的gridview。然后你可以在代码隐藏中以程序化的方式做任何事情。