代码之家  ›  专栏  ›  技术社区  ›  Moo

spgridview、数据和确保数据安全的正确方法

  •  3
  • Moo  · 技术社区  · 15 年前

    我正在使用spgridview呈现一些数据,并启用了过滤功能,它工作得很好。直到在数据中选择要筛选的特定项…

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

    Syntax error: Missing operand after 's' operator. 
    

    显然,数据并不是自动安全的…

    数据位于DataTable中,并且使用DataTable的ObjectDatasource馈送SPGridView。

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

    编辑:

    在苦恼之后,我找到了部分答案,但问题仍然存在。

    部分答案是-您可以使数据对筛选代码安全,但在筛选下拉GUI中不能使其看起来正确。

    将boundField.htmlEncode=true;添加到spgridView定义中不起任何作用。

    对字符串使用httputility.htmlencode没有任何作用。

    手动将数据中的所有撇号替换为与39;插入数据表时,允许筛选器正常工作,并且数据在spgridview中显示良好,但在筛选器下拉列表中显示为HTML替换字符串,而不是撇号字符。这是部分解决方案,并不能真正使用,因为它创建了一个对最终用户可见的糟糕的筛选字符串。

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

    当做 理查德

    1 回复  |  直到 13 年前
        1
  •  3
  •   Kit Menke    15 年前

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

    编辑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,grids是objectDatasource类型,我相信这是唯一一种您可以使用spgridview进行过滤的类型。基本上,我认为所发生的是微软代码中有一个bug,它并没有真正给你一个在过滤器表达式中卡住之前验证过滤器值的机会。使用Reflector,我可以发现spgridView实际上只是设置了数据源的filterExpression。它使用反射和您为grid.filteredDatasourcePropertyName属性输入的值来完成此操作(在所有示例中,我总是看到它被设置为“filterExpression”)。

    参考文献: http://www.reversealchemy.net/2009/05/24/building-a-spgridview-control-part-2-filtering/