Стиль td в повторителе не будет выводить связанное значение («Это не скриптлет. Будет выводиться как обычный текст») - PullRequest
2 голосов
/ 23 марта 2012

У меня есть повторитель с таблицей в нем, с множеством свойств тд, связанных с повторителем.Мне пришлось добавить сервер runat к каждому td, чтобы я мог добавить видимый атрибут, потому что в зависимости от данных некоторые tds не видны.

Теперь я добавил сервер runat. У меня проблема с настройкойцвет фона моего тдс.Это сделано со связанным значением.Когда я добавляю свои теги <%%> в свой стиль, они выводятся в виде простого текста, в моем html даже говорится, что «Это не скриптлет. Будет выводиться как простой текст», где, как и остальные мои теги <%%>привязать правильно.

Почему мой стиль больше не связывается?

Другие теги, которые я добавлю, будут, но только не стиль?

Вот урезанная версия моего повторителя.

   <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 голосов
/ 31 марта 2012

Первое, что я бы порекомендовал, это использовать классы css вместо того, что вы делаете.

Когда вы используете элементы html с runat = server, вы конвертируете его в элемент управления html, а .net отображаетокончательный вывод.Ваша конкретная проблема возникает из-за того, что .net заключает в себе значение с помощью htmlencode или чего-то в этом роде.

Я хотел бы предложить, возможно, использовать gridview с событием onrowdatabound.Тогда вы можете делать все программно в коде позади.

0 голосов
/ 27 марта 2012

Только что заметил, что мой ответ точно такой же, как и у сэра Криспалота! Однако я проверил это и повторил ошибку и исправление в Visual Studio 2008 ...

Вот так ...

<td id="Td9" title='<%#Eval("Item1Status")%>' 
    runat="server" 
    visible='<%#ItemAllowed("Item2")%>'
    style='<%# "background-color:" + Eval("Item2StatusColour")%>' >

Я считаю, что Eval ожидает имя элемента данных, а не выражение. Однако <%# %> ожидает выражение, которое может содержать операции. Здесь можно использовать Eval и объединить его в строку "background-color".

Я не совсем ухмыляюсь за все встроенные теги asp - это всегда головная боль!

PS - Я заметил, что между номерами предметов в ваших <td> s есть несоответствие - это преднамеренно? например, Item1 и Item2 ссылаются на один и тот же <td> ...

0 голосов
/ 27 марта 2012

Если ваши элементы управления запущены на сервере, я бы лично порекомендовал подключиться к событию 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, но это просто предпочтение.

0 голосов
/ 23 марта 2012

Я не думаю, что ему нравится комбинация кода и встроенных строк, поэтому вы можете попробовать сделать все это в коде:

<td ... style='<%# "background-color:" + Eval("Item2StatusColour")%>'>

К сожалению, передо мной нет VS, поэтому не могу проверить это, дайте мне знать, если это работает.

...