3

我正在使用 SPGridView 来呈现一些数据,并启用了非常有效的过滤功能。直到您选择要过滤的数据中的特定项目...

有问题的数据项在字符串中有一个撇号(例如“这是理查兹的字符串”),这会导致过滤后应用程序页面加载因错误而终止:

Syntax error: Missing operand after 's' operator. 

显然,数据不会自动变得安全......

数据在数据表中,并且 SPGridView 使用使用数据表的 objectdatasource 馈送。

确保数据安全使用的最佳或正确方法是什么?

编辑:

经过一番咬牙切齿,我找到了部分答案,但问题仍然存在。

部分答案是 - 您可以使过滤器代码的数据安全,但您无法使其在过滤器下拉 gui 中看起来正确。

添加 BoundField.HtmlEncode = true; 到 SPGridView 定义什么都不做。

在字符串上使用 HttpUtility.HtmlEncode 什么也不做。

用 & #39 手动替换数据中的所有撇号;在插入 DataTable 时允许过滤器正常工作,并且数据在 SPGridView 中显示正常,但它在过滤器下拉列表中显示 html 替换字符串,而不是撇号字符。这是部分解决方案,并不能真正使用,因为它会创建一个对最终用户可见的可怕过滤器字符串。

我仍然要找到这个问题的完整解决方案,除了从数据中完全删除违规字符,这并不是真正的解决方案。

问候理查德

4

1 回答 1

2

撇号是过滤器中的特殊字符。尝试用(双撇号"'")替换(一个撇号)的所有实例。"''"

编辑 09/01/2009

好的,所以我花费的时间比我想象的要长得多。您只需要将其添加到您的 Web 部件代码中:

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/

于 2009-09-01T14:43:49.900 回答