2009-08-29 16 views
3

J'utilise un SPGridView pour présenter certaines données, et j'ai activé la capacité de filtrage qui fonctionne très bien. Jusqu'à ce que vous choisissiez un élément particulier dans les données à filtrer ...SPGridView, données et méthode correcte pour assurer la sécurité des données

L'élément de données en question a une apostrophe dans la chaîne (par exemple, "ceci est la chaîne de richards"), ce qui provoque la page d'application post-filtre charge de mourir avec l'erreur:

Syntax error: Missing operand after 's' operator. 

Il est évident que les données ne sont pas automatiquement sécurisée ...

les données se trouve dans une table de données, et le SPGridView est alimenté au moyen d'un ObjectDataSource en utilisant la table de données.

Quelle est la meilleure ou la meilleure méthode pour garantir que les données sont sécurisées?

EDIT:

Après beaucoup de grincements, j'ai trouvé une réponse partielle, mais la question reste encore. La réponse partielle est - vous pouvez sécuriser les données pour le code de filtre, mais vous ne pouvez pas le rendre correct dans le menu déroulant du filtre.

Ajout de BoundField.HtmlEncode = true; à la définition SPGridView ne fait rien.

L'utilisation de HttpUtility.HtmlEncode sur la chaîne ne fait rien.

Remplacer manuellement toutes les apostrophes dans les données avec l'esperluette # 39; lors de l'insertion dans DataTable, le filtre fonctionne correctement et les données s'affichent correctement dans SPGridView, mais elles s'affichent avec la chaîne de remplacement html dans la liste déroulante du filtre, et non le caractère apostrophe. C'est la solution partielle, et elle n'est pas vraiment utilisable car elle crée une horrible chaîne de filtre visible par l'utilisateur final.

Je suis encore à trouver une solution complète à ce problème, sauf pour supprimer les caractères fautifs des données tout à fait, ce qui n'est pas vraiment une solution.

Cordialement Richard

+0

C'est une question que je lu, mais nulle part I'v vu une meilleure solution que vous avez trouvé. –

Répondre

3

L'Apostrophe est un caractère spécial dans les filtres. Essayez de remplacer toutes les instances de "'" (une apostrophe) par "''" (double apostrophe).

Modifier 09/01/2009

Ok, donc il m'a fallu beaucoup plus longtemps que ce que je pensais réellement obtenir ce travail. Vous devriez juste besoin d'ajouter ceci à votre code partie 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); 
} 

Au-dessus, la grille est votre SPGridView et gridDS est de type ObjectDataSource que je crois est le seul type que vous serez en mesure d'obtenir le filtrage de travailler avec un SPGridView. Fondamentalement, je pense que ce qui se passe est qu'il ya un bogue dans le code Microsoft et il ne vous donne pas vraiment une chance de valider la valeur du filtre avant qu'il ne soit bloqué dans le FilterExpression. En utilisant Reflector, j'ai été capable de comprendre que le SPGridView ne fait que définir la FilterExpression de votre source de données. Il le fait en utilisant la réflexion et la valeur que vous avez entrée pour votre propriété grid.FilteredDataSourcePropertyName (je la vois toujours être définie sur "FilterExpression" dans tous les exemples).

Référence: http://www.reversealchemy.net/2009/05/24/building-a-spgridview-control-part-2-filtering/

+0

Qu'est-ce que cela va faire à l'affichage de l'information tho? L'apostrophe double apparaîtra-t-elle dans la SPGridView lorsqu'elle sera rendue à l'utilisateur final? – Moo

+0

J'ai édité ma réponse pour être plus complète. –

+0

Vous, monsieur, juste gagné vous-même un tas de réputation :) Oh, et mes éternels remerciements! Votre solution a parfaitement fonctionné. – Moo