#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
как общедоступную или защищенную строковую переменную в исходном коде.