我使用的是SPGridView呈现一些数据,并启用它工作得非常好过滤能力。 直到你选择在数据中的特定项目筛选上...
在考虑中的数据项具有所述串中一个撇号(例如,“这是Richards的字符串”),这会导致滤波器应用后页面加载与错误死:
Syntax error: Missing operand after 's' operator.
显然,数据是不会自动变得安全?
该数据是一个数据表,并且SPGridView使用使用DataTable一个ObjectDataSource送入。
最新最好的,或者是正确的,方法,以确保数据的安全使用?
编辑:
多咬牙切齿后,我已经找到了部分答案,但问题仍然存在。
部分答案是 - 可以使数据安全的过滤代码,但你再不能让它的过滤器下拉菜单GUI看起来是正确的。
添加BoundField.HtmlEncode = TRUE; 到SPGridView定义不做任何事情。
在字符串中使用HttpUtility.HtmlEncode什么都不做。
手动替换所有单引号与符号#39中的数据; 在插入数据表允许过滤器工作正常,数据显示在SPGridView很好,但它显示在过滤器下拉列表中的HTML替换字符串,而不是单引号字符。 这是部分解决方案,并且作为它创建了一个可怕过滤字符串是对最终用户可见不是真正可用。
我还是找到了这个问题的完整解决方案,节省了从完全的数据,这是不是一个真正的解决办法移除违规字符。
问候理查德
该撇号是在过滤器一个特殊字符。 尝试更换的所有实例"'"
与(一个单引号) "''"
(双撇号)。
编辑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);
}
以上,电网是您SPGridView和gridDS是类型的ObjectDataSource我相信这是,你将能够得到过滤与SPGridView工作的唯一类型。 基本上,我觉得会发生什么情况是,有在微软的源代码中的错误,它并没有真正给你一个机会来验证过滤器值就陷在FilterExpression之前。 使用反射器,我能想出的SPGridView真的只是设置你的数据源的FilterExpression。 为此,它使用反射和您为grid.FilteredDataSourcePropertyName属性中输入值(我总是看到它被设置为在所有的例子“FilterExpression”)。
参考: http://www.reversealchemy.net/2009/05/24/building-a-spgridview-control-part-2-filtering/