SPGridView,数据和确保数据的正确方法是安全的

时间:2009-08-29 14:32:24

标签: sharepoint datatable objectdatasource spgridview

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

有问题的数据项在字符串中有一个撇号(例如“这是richards'字符串”),这导致后过滤器应用程序页面加载死亡并出现错误:

Syntax error: Missing operand after 's' operator. 

显然数据不会自动安全......

数据位于数据表中,SPGridView使用数据表使用objectdatasource提供。

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

编辑:

经过多次嘲笑之后,我找到了部分答案,但问题仍然存在。

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

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

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

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

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

此致 理查德

1 个答案:

答案 0 :(得分:3)

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

编辑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/