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

アポストロフィは、フィルター内の特殊文字です。"'"(1 つのアポストロフィ) のすべてのインスタンスを (2つのアポストロフィ)に置き換えてみてください"''"

2009/09/01 編集

わかりました、実際にこれを機能させるには、思ったよりもずっと時間がかかりました。これを 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 に答える