SPGridView, данные и правильный метод обеспечения безопасности данных - PullRequest
3 голосов
/ 29 августа 2009

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

Элемент данных, о котором идет речь, имеет апостроф в строке (например, «это строка Ричардса»), что приводит к прекращению загрузки страницы приложения после фильтрации с ошибкой:

Syntax error: Missing operand after 's' operator. 

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

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

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

EDIT:

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

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

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

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

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

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

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

1 Ответ

3 голосов
/ 01 сентября 2009

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

Редактировать 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/

...