SPGridView, данные и правильный метод обеспечения безопасности данных

Я использую SPGridView для представления некоторых данных и включил возможность фильтрации, которая работает очень хорошо. Пока вы не выберете определенный элемент данных для фильтрации...

У рассматриваемого элемента данных есть апостроф в строке (например, "это строка Ричардса"), который приводит к тому, что загрузка страницы после фильтрации перестает работать с ошибкой:

Syntax error: Missing operand after 's' operator. 

Очевидно, что данные не становятся автоматически безопасными...

Данные находятся в базе данных, и SPGridView подается с использованием источника данных объекта с использованием таблицы данных.

Каков наилучший или правильный метод обеспечения безопасности данных?

РЕДАКТИРОВАТЬ:

После большого скрежета я нашел частичный ответ, но вопрос все еще остается.

Частичный ответ - вы можете сделать данные безопасными для кода фильтра, но затем вы не сможете заставить их выглядеть правильно в выпадающем меню фильтра.

Добавление BoundField.HtmlEncode = true; к определению SPGridView ничего не делает.

Использование HttpUtility.HtmlEncode в строке ничего не делает.

Вручную заменяя все апострофы в данных амперсандом #39; вставка в DataTable позволяет фильтру работать нормально, и данные хорошо отображаются в SPGridView, но отображаются со строкой замены html в раскрывающемся списке фильтра, а не с символом апострофа. Это частичное решение, и на самом деле его нельзя использовать, так как оно создает ужасную строку фильтра, которая видна конечному пользователю.

Мне еще предстоит найти полное решение этой проблемы, за исключением полного удаления оскорбительных символов из данных, что на самом деле не является решением.

С уважением Ричард

1 ответ

Решение

Апостроф - это специальный символ в фильтрах. Попробуйте заменить все экземпляры "'" (один апостроф) с "''" (двойной апостроф).

Изменить 09/01/2009

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

protected override void OnPreRender(EventArgs e)
{
    if (!string.IsNullOrEmpty(gridDS.FilterExpression))
    {
        _gridDS.FilterExpression = string.Format(
            _grid.FilteredDataSourcePropertyFormat,
            _grid.FilterFieldValue.Replace("'", "''"),
            _grid.FilterFieldName
            );
    }

    base.OnPreRender(e);
}

Выше, grid - это ваш SPGridView, а gridDS имеет тип ObjectDataSource, который, как я считаю, является единственным типом, который вы сможете получить для работы с SPGridView. По сути, я думаю, что происходит то, что в коде Microsoft есть ошибка, которая не дает вам возможности проверить значение фильтра до того, как оно застрянет в FilterExpression. Используя Reflector, я смог выяснить, что SPGridView действительно просто устанавливает FilterExpression вашего источника данных. Это делается с использованием отражения и значения, которое вы ввели для своего свойства grid.FilteredDataSourcePropertyName (во всех примерах я всегда вижу его равным "FilterExpression").

Ссылка: http://www.reversealchemy.net/2009/05/24/building-a-spgridview-control-part-2-filtering/

Другие вопросы по тегам