Comment échapper à une simple citation pour être utilisé dans une requête OData?

J'utilise OData pour interroger ma base de données. La ligne de code suivante fonctionne bien lorsque "adapterName" ne contient que du texte.

ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, '');

si "adapterName" contient une seule citation, il échoue. J'ai essayé d'échapper à la citation simple en utilisant le code suivant:

adapterName = adapterName.replace(/\'/g, '\\'');

bien que cela échappe correctement le texte défini par l'utilisateur la fonction échoue toujours. Est-ce que quelqu'un peut me dire quel est le format correct pour le texte dans la requête?

25
demandé sur Retrocoder 2010-10-20 19:11:00
la source

4 ответов

en Fait %27 n'est pas une solution. La bonne façon de s'échapper est de placer deux guillemets simples dans la chaîne à la place d'un. Dans l'exemple "o''clock"

81
répondu 2010-12-19 18:59:28
la source

je veux développer un peu la réponse pour qu'elle s'applique aussi à l'appel d'une action d'opération de service oData. La réponse postée est correcte, mais il y a un ordre spécifique dans lequel les paramètres d'une opération de service doivent être encodés.

Service oData Opérations de recevoir une primitive de type de paramètres, où les chaînes sont enfermés dans un " tels qu'une url valide (pré codage) sera quant à lui

AddString?valeur= "o"clock'

cela va causer le serveur pour voir

AddString?valeur='o'

et

horloge

produira " Bad Request-Error in query syntax."

pour corriger cela, vous devez double escape le ' et UrlEncode il avant l'insertion dans l'url.

Ne pas UrlEncode l'url elle-même.

Voici un exemple qui fonctionne.

// value passed as "o'clock"
public async Task AddString(string value)
{
    // Escape ' with '' and UrlEncode value
    value = HttpUtility.UrlEncode(value.Replace("'", "''"));

    string url = String.Format("AddString?value='{0}'", value);

    // No need to UrlEncode url here as dynamic content has already been escaped 

    // Execute .....
}

[WebGet]
public void AddString(string value) 
{
    // here value will be "o'clock"
}
6
répondu Mike Michaelis 2014-11-18 18:03:03
la source

lorsque vous utilisez wit substringof it doit être échappé en ayant 4 au lieu de 1 apostrophe:

a'b -> $filter=(substringof('a''''b', FirstName))

0
répondu Adaptabi 2013-03-01 07:43:08
la source

au Lieu d'utiliser $filtre=Titre eq 'texte'

j'utilise la fonction oData startswith ().

$filtre=startswith(Titre, clé)

et puis je passe autant de clés que je peux.

var pos = key.indexOf("'");

if(pos > -1) {

key = key.substring(0, pos);

}

-1
répondu jmb.mage 2014-07-08 20:49:09
la source

Autres questions sur