转发器中的td样式不会输出绑定值(“这不是一个scriptlet。将输出为纯文本”)

时间:2012-03-23 11:47:54

标签: c# asp.net data-binding repeater

我有一个带有表格的转发器,其中有许多由转发器绑定的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:&lt;%# &quot;&quot;+ Eval(&quot;Item1StatusColour&quot;)%>;" 

该属性的所有其余部分呈现它们应该如何。

更新 这是所请求的ItemAllowed方法

     public bool ItemAllowed(string item)
        {
//allowed items is a list<string>

            return AllowedItems.Contains(item);
        }

4 个答案:

答案 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;

    ...
}

旁注

从更具可读性的角度来看,我还建议将控件重命名为更具可读性的内容,即什么是td9td10td11?相反,它会更容易理解是tdFirstStatustdSecondStatus还是tdThirdStatus,但这只是偏好。

答案 3 :(得分:0)

我建议的第一件事是使用css类而不是你正在做的事情。

当你使用runat = server的html元素时,你将它转换为html控件,而.net正在渲染最终输出。你的特殊问题来自.net用htmlencode包装值或其他东西。

我建议使用带有onrowdatabound事件的gridview。然后你可以在代码隐藏中以程序化的方式做任何事情。