中继器中的 TD 样式不会输出绑定值 ( "This is not a scriptlet. Will output as plain text" )



我有一个中继器,里面有一个表,里面有中继器绑定的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:&lt;%# &quot;&quot;+ Eval(&quot;Item1StatusColour&quot;)%>;" 

该属性的所有其余部分都以其应有的方式进行渲染。

更新这是请求的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;
    ...
}

附带说明

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

刚刚注意到我的答案和克里斯帕罗特爵士的完全一样!然而,我已经对此进行了测试,并在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内被引用。。。

最新更新