c# - framework - ¿Cómo escapar de una sola cita para ser utilizada en una consulta OData?
odata web api filter (4)
Estoy usando OData para consultar mi base de datos. La siguiente línea de código funciona bien cuando "adapterName" solo contiene texto.
ds.query(''/DataAdapters?$filter=Name eq /''' + adapterName + ''/''', ifmgr_CreateAdapter_Step1, onGenericFailure, '''');
Si "adapterName" contiene una comilla simple, falla. Intenté escapar de la comilla simple usando el siguiente código:
adapterName = adapterName.replace(//'/g, ''///''');
Aunque esto escapa correctamente al texto definido por el usuario, la función todavía falla. ¿Alguien puede decirme cuál es el formato correcto para el texto en la consulta?
Cuando se usa wit substringof, debe escaparse teniendo 4 en lugar de 1 apóstrofe:
a''b -> $filter=(substringof(''a''''''''b'', FirstName))
En lugar de usar $ filter = Título eq ''texto''
Estoy usando la función oData startswith ().
$ filter = startswith (Título, clave)
Y luego paso tanto de llave como puedo.
var pos = key.indexOf("''");
if(pos > -1) {
key = key.substring(0, pos);
}
En realidad% 27 no es una solución. La forma correcta de escapar es colocar dos comillas simples en la cadena en lugar de una. En el ejemplo "o''''clock"
Quiero ampliar un poco la respuesta para que también se aplique a una acción de operación del servicio oData. La respuesta publicada es correcta, pero hay un orden específico en el que se deben codificar los parámetros de una operación de servicio.
oData Service Operations recibe parámetros de tipo primitivo donde las cadenas están encerradas en un ''tal que una url válida (precodificación) será como tal
AddString? Value = ''o''''clock''
Esto hará que el servidor vea
AddString? Value = ''o''
y
''reloj''
producirá "Solicitud incorrecta: error en la sintaxis de consulta".
Para corregir esto, debe hacer doble escape del ''y Urlcódigo'' antes de insertarlo en el url.
No urlice la url en sí.
Aquí hay un ejemplo que funcionará.
// 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"
}