Форматирование html внутри элемента td с помощью webforms

#c# #asp.net #webforms

#c# #asp.net #веб-формы

Вопрос:

У меня есть DataTable который привязан к GridView

 DataTable dt = GetTable();
myGridView.DataSource = dt;
myGridView.DataBind();
  

В одном из столбцов DataTable Sentence . У меня есть строка, которая может содержать поисковый запрос, Word

Я надеялся выделить любые экземпляры Word в каждой строке этого столбца другим цветным фоном, поэтому попробовал это:

 DataTable dt = GetTable();

foreach (DataRow dr in dt.Rows)
{
    dr("Sentence") = dr("Sentence").ToString().Replace(Word, "<span style='background-color: #ccc;'>"   Word   "</span>")
}

myGridView.DataSource = dt;
myGridView.DataBind();
  

Это заменяет текст, но он просто остается как текст, он не преобразуется в встроенный стиль HTML, который я хотел.

например, предложение I want my searchword to be highlighted просто становится I want my <span style='background-color: #ccc;'>searchword</span> to be highlighted

Я думаю, это как-то связано с предварительным форматированием, но когда я гуглю, это дает мне результаты для пробелов, и если я использую pre элемент вместо td , это просто делает все курьером.

The asp.net представление для этого столбца выглядит следующим образом:

 <asp:BoundField DataField="Sentence" HeaderText="Sentence" SortExpression="Sentence" Visible="false">
    <ItemStyle CssClass="preformatted" />
    <HeaderStyle Wrap="False" />
</asp:BoundField>
  

И предварительно отформатированный класс в настоящее время просто white-space: pre-line;

Комментарии:

1. DataTable — это контейнер данных на стороне сервера. Это не имеет никакого отношения к HTML. Было бы лучше, если бы вы использовали List<T> со строго типизированным объектом на самом деле. Где ASP.NET код, который генерирует таблицу HTML? Используете ли вы WebForms, MVC, Razor Pages?

2. @PanagiotisKanavos добавил это к вопросу

3.Когда ASP.NET переводит данные в HTML, все данные закодированы в HTML, как для предотвращения взлома HTML путем введения неожиданных символов, таких как > и для предотвращения внедрения скрипта. Вы не можете изменить форматирование HTML путем изменения данных, вы должны сделать это в коде рендеринга

4. Таким образом, я мог бы сделать это в связанных данных, как только они окажутся в gridview вместо этого?

5. Вероятно, мне лучше всего использовать какой-нибудь js для этого :/

Ответ №1:

Благодаря совету Панайотиса Канавоса я смог сделать это, используя TemplateField — это старая шляпа и хорошо документированные веб-формы, которые я знаю, но ответ все еще может оказаться кому-то полезным.

Я заменил boundfield

 <asp:BoundField DataField="Sentence" HeaderText="Sentence" SortExpression="Sentence" Visible="false">
    <ItemStyle CssClass="preformatted" />
    <HeaderStyle Wrap="False" />
</asp:BoundField>
  

с помощью поля шаблона

 <asp:TemplateField HeaderText="Sentence" SortExpression="Sentence" Visible="true" >
    <ItemTemplate>
        <asp:Label runat="server" Text='<%# Replace(Eval("Sentence"), wordSearched, "<span class=""high"">" amp; wordSearched amp; "</span>") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>
  

Где мне пришлось определить wordSearched как общедоступную или защищенную строковую переменную в исходном коде.