【问题标题】:Error when passing quotes to webservice by AJAX通过 AJAX 将引号传递给 Web 服务时出错
【发布时间】:2011-05-31 08:44:03
【问题描述】:

我正在使用 .ajax 传递数据,这里是我的 data 和 contentType 属性:

data: '{ "UserInput" : "' + $('#txtInput').val() + '","Options" : { "Foo1":' + bar1 + ', "Foo2":' + Bar2 + ', "Flags":"' + flags + '", "Immunity":' + immunity + '}}',
contentType: 'application/json; charset=utf-8',

服务器端我的代码如下所示:

<WebMethod()> _
Public Shared Function ParseData(ByVal UserInput As String, ByVal Options As Options) As String

用户输入很明显,但Options 结构如下:

Public Structure Options
    Dim Foo1 As Boolean
    Dim Foo2 As Boolean
    Dim Flags As String
    Dim Immunity As Integer
End Structure

$('#txtInput') 不包含双引号时一切正常,但如果它们存在,我会收到错误消息(对于 asd 的输入):

{"Message":"Invalid object passed in, \u0027:\u0027 or \u0027}\u0027 expected. (22): { \"UserInput\" : \"asd\"\",\"Options\" : { \"Foo1\":false, \"Foo2\":false, \"Flags\":\"\", \"Immunity\":0}}","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}

知道如何避免这个错误吗?此外,当我直接使用引号传递相同的输入时,它工作正常。

【问题讨论】:

    标签: jquery asp.net ajax vb.net


    【解决方案1】:

    您是否尝试过转义文本,或将双引号替换为单引号,或将双引号替换为转义字符:\"

    【讨论】:

    • jQuery 应该已经转义了 $('#txtInput').val() 传递的文本。如果输入单引号,则如果手动转义字符,则它可以正常工作并且相同。但是,如果您查看实际传递的内容,就会发现它已经被转义了:\"asd\"\"(用于 asd 的输入)。
    • 哦,是的,好的,我现在明白了。对于那个很抱歉。您是否尝试过客户端 Sys.Serialization.JavaScriptSerializer.serialize 方法来进行表单序列化?似乎服务器端的 JSSerializer 不喜欢提供的东西......而且可能是 JQuery 正在做一些不同的事情。
    • 我没有,我很惭愧地说我已经采取了简单的方法:.replace(/\"/g,"'")。如果我确实找到了解决方案,我一定会更新。
    【解决方案2】:

    只是为了澄清最后一个答案...该对象将在服务器端进行评估,并且由于字段值是一个字符串,因此其中的任何双引号都需要转义 - 所以应该是 \"。因为这也是js 转义需要将两个字符转义到 \\"

    $("#txtInput").val().replace(/\"\g, "\\\"") 
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。这是我的解决方案:

      $.RFStringify = function(obj) {
        var result = obj;
        try {
          result = JSON.stringify(obj);
          result = result.replace(/([^\\])\\\"/g, '$1\\\\\\\"').replace(/([^\\])\"/g, '$1\\\"').replace(/(\")\"/g, '$1\\\"');
        } catch (ex) {
          // $.RFAlertEx(ex);
        } finally {
          return result;
        }
      };
      var a = {
        a: 'a',
        b: {
          b: 'B',
          c: '{"c":"c","d":{"d":"D","e":"E"}}'
        }
      };
      $('#result').html($.RFStringify(a));
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
      <div id="result">ERROR</div>

      希望对您有所帮助。

      我们可以在javascript客户端使用escape(result)。 并在服务器端使用Microsoft.JScript.GlobalObject.unescape(data)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-12
        • 2018-06-16
        • 2015-03-06
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 2012-12-01
        相关资源
        最近更新 更多