如何转义要在OData查询中使用的单引号?

Ret*_*der 29 c# odata

我正在使用OData来查询我的数据库.当"adapterName"只包含文本时,以下代码行正常工作.

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

如果"adapterName"包含单引号则失败.我尝试使用以下代码转义单引号:

adapterName = adapterName.replace(/\'/g, '\\\'');
Run Code Online (Sandbox Code Playgroud)

虽然这正确地逃避了用户定义的文本,但该功能仍然失败.谁能告诉我查询中文本的正确格式是什么?

小智 91

实际上%27不是解决方案.正确的转义方法是将两个单引号放入字符串而不是一个.在例子中"o''clock"

  • +1.替换'with \'或%27似乎不适用于odata查询.这应该是公认的答案. (8认同)
  • 为什么这个似乎在相关的地方没有记录,我有点不知所措http://www.odata.org/documentation/overview/#AbstractTypeSystem (3认同)
  • 我完全同意,%27 由于请求路径中的无效字符而给出 400 个错误请求。 (2认同)

小智 8

我想稍微扩展一下答案,以便它也适用于调用oData服务操作操作.回答的答案是正确的,但是有一个特定的顺序,其中服务操作的参数必须编码.

oData服务操作接收基本类型参​​数,其中字符串被包含在'使得有效URL(预编码)将如此

AddString?值= '时许'

这将导致服务器看到

AddStringα值= 'O'

'时钟'

将产生"错误请求 - 查询语法错误".

要更正此问题,您必须在插入网址之前双重转义'和UrlEncode.

不要UrlEncode网址本身.

这是一个可行的例子.

// 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"
}
Run Code Online (Sandbox Code Playgroud)