Как использовать HtmlEncode с TemplateFields, привязкой данных и GridView - PullRequest
23 голосов
/ 04 февраля 2009

У меня есть GridView, связанный с ObjectDataSource. У меня есть поддержка редактирования, которая прекрасно работает. Однако я хотел бы безопасно использовать текст HtmlEncode, который отображается, поскольку мы разрешаем использование специальных символов в определенных полях. Это легко сделать со стандартными BoundFields, так как я просто установил HtmlEncode в true.

Но для того, чтобы настроить элементы управления валидацией, нужно вместо этого использовать TemplateFields. Как мне легко добавить HtmlEncoding для вывода таким образом? Это проект ASP.NET 2.0, поэтому я использую более новые ярлыки привязки данных (например, Eval и Bind).

Я хотел бы сделать что-то вроде следующего:

<asp:TemplateField HeaderText="Description">
    <EditItemTemplate>
        <asp:TextBox ID="TextBoxDescription" runat="server"
                     Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'
                     ValidationGroup="EditItemGrid"
                     MaxLength="30" />
        <asp:Validator ... />
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="LabelDescription" runat="server"
                   Text='<%# System.Web.HttpUtility.HtmlEncode(Eval("Description")) %>' />
    </ItemTemplate>
</asp:TemplateField>

Однако, когда я пытаюсь сделать это таким образом, я получаю следующую ошибку:

CS0103: имя «Bind» не существует в текущем контексте

Ответы [ 9 ]

30 голосов
/ 06 ноября 2013

Теперь это можно сделать с помощью нового синтаксиса привязки данных в кодировке HTML, представленного в ASP.NET 4.

Вы можете просто использовать:

<%#: Eval("MyField") %>

Или

<%#: Bind("MyField") %>

Обратите внимание на двоеточие после знака фунта / хеша Это так просто.

17 голосов
/ 04 февраля 2009

Цитата от http://weblogs.asp.net/leftslipper/archive/2007/06/29/how-asp-net-databinding-deals-with-eval-and-bind-statements.aspx

Нет метода Bind в ASP.NET. Когда ASP.NET анализирует ваш файл и видит, что вы используете

это порождает некоторые специальный код для него. Когда вы используете это не настоящий вызов функции. Если ASP.NET анализирует код и обнаруживает привязку () утверждение, оно разделяет утверждение на две части. Первая часть односторонняя часть привязки данных, которая в конечном итоге просто обычный Eval () вызов. Вторая часть обратная часть, которая обычно представляет собой некоторый код вдоль строк "имя строки = TextBox1.Text ", который захватывает значение отступить от того, где он был связан. Тем не менее, потому что ASP.NET должен разобрать Операторы Bind (), двусторонняя привязка данных не поддерживает ничего, кроме Bind (). Например, следующее синтаксис недопустим, потому что он пытается вызвать произвольный код и использовать Bind () в то же время:

Единственные форматы, поддерживаемые в двух направлениях привязкой данных являются Bind («поле») и Bind («поле», «строка формата {0}»).

Вы можете использовать Eval вместо Bind в вашем EditItemTemplate. Вам также необходимо привести к строке:

<asp:Label ID="LabelDescription" 
           runat="server" 
           Text='<%# System.Web.HttpUtility.HtmlEncode((string)Eval("Description")) %>' />
8 голосов
/ 11 апреля 2010

Как уже объяснил Дарин Димитров, вы не можете использовать Bind в качестве параметра функции. Так что Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>' невозможно. С другой стороны, здесь обычно нет необходимости использовать HtmlEncode, потому что вы будете использовать Bind с элементом управления, который позволяет изменять данные, например, вместе с TextBox (как в примере с вашим EditItemTemplate). Но TextBox кодирует автоматически, поэтому вы можете безопасно вызывать Bind без необходимости использования HtmlEncode:

<EditItemTemplate>
    <asp:TextBox ID="TextBoxDescription" runat="server"
                 Text='<%# Bind("Description") %>'
                 ValidationGroup="EditItemGrid"
                 MaxLength="30" />
    <asp:Validator ... />
</EditItemTemplate>

Если TextBox не будет кодировать автоматически с использованием Bind, это будет огромной дырой в безопасности (если только вы не абсолютно уверены, что ваши данные в безопасности для отображения в HTML без кодирования).

Но, например, автоматическое кодирование НЕ относится к метке. Хотя вы также можете использовать Bind в свойстве «Текст» метки, вывод на метку НЕ кодируется автоматически - причина, по которой использование Bind с меткой не является хорошей практикой, поскольку вы не можете кодировать текст метки с Bind. Вместо этого используйте Eval и оберните его в HtmlEncode, как вы это делали в шаблоне ItemTemplate: Text='<%# System.Web.HttpUtility.HtmlEncode((string)Eval("Description")) %>'

6 голосов
/ 17 октября 2012
<asp:TemplateField HeaderText="Description">     
  <EditItemTemplate>         
    <asp:TextBox ID="TextBoxDescription" runat="server" Text='<%# System.Web.HttpUtility.HtmlEncode(Bind("Description")) %>'                ValidationGroup="EditItemGrid"  MaxLength="30" />
     <asp:Validator ... />     
  </EditItemTemplate>     
  <ItemTemplate>         
     <asp:Label ID="LabelDescription" runat="server"  Text='<%# System.Web.HttpUtility.HtmlEncode(Convert.ToString(Eval("Description"))) %>' /> 
  </ItemTemplate> 
</asp:TemplateField> 
2 голосов
/ 05 февраля 2009

Bind () используется для Двусторонняя привязка данных , чтобы это работало, вам придется использовать событие RowUpdating в виде сетки.

void GridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
    foreach (DictionaryEntry entry in e.NewValues)
    {
        e.NewValues[entry.Key] = System.Web.HttpUtility.HtmlEncode(entry.Value.ToString());
    }
}
1 голос
/ 31 августа 2016

В моем случае я был вынужден использовать метод «Bind» в TextBox mi EditItemTemplate, потому что требовался доступ к данным в массиве NewValues ​​при обработке события item_Updating. Итак, я понял, как следует:

на моем EditItemTemplate:

<EditItemTemplate>
     <asp:TextBox runat="server" Text='<%# Bind("field")%>' ID="TextBox112" OnPreRender="TextBox_PreRender_decode"></asp:TextBox>                                            
</EditItemTemplate> 

затем в коде:

protected void TextBox_PreRender_decode(object sender, EventArgs e)
{
    TextBox tb = (TextBox)sender;
    tb.Text = WebUtility.HtmlDecode(tb.Text);
}

Это решение позволило мне правильно отображать html-кодированные данные для всех моих TextBox и одновременно иметь возможность доступа к этим данным из массива newValues ​​при возникновении события item_Updating.

1 голос
/ 16 сентября 2010

Пожалуйста, обратитесь к

http://forums.asp.net/p/1056231/1504717.aspx

Я получил рабочее решение отсюда. Это работает как очарование для меня.

1 голос
/ 08 сентября 2010

А как насчет простого метода расширения?

public static string HtmlEncode(this string s)
    {            
        s = HttpUtility.HtmlEncode(s);
        return s;
    }

Вы можете просто запустить:

<asp:Label runat="server" Text=<%# ((string)Eval("MyStringField")).HtmlEncode() %> />
0 голосов
/ 04 марта 2010

Но будьте осторожны, если вы используете следующий код из Phaedrus и у вас есть столбец флажка!

void GridView_RowUpdating(Object sender, GridViewUpdateEventArgs e)
{
    foreach (DictionaryEntry entry in e.NewValues)
    {
        e.NewValues[entry.Key] = System.Web.HttpUtility.HtmlEncode(entry.Value.ToString());
    }
}

Поскольку entry.Value.ToString() сделает значение из флажка в True, а затем вы не сможете сохранить его в поле базы данных!

...