通过AJAX将引号传递给webservice时出错

时间:2010-12-27 23:20:41

标签: jquery asp.net ajax vb.net

我使用.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"}

知道我怎么能避免这个错误吗?另外,当我直接用引号传递相同的输入时,它可以正常工作。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

&#13;
&#13;
$.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));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="result">ERROR</div>
&#13;
&#13;
&#13;

希望它会有所帮助。

OR

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