Ошибка при передаче кавычек на веб-сервис от AJAX - PullRequest
4 голосов
/ 28 декабря 2010

Я передаю данные, используя .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 ]

3 голосов
/ 28 декабря 2010

Вы пытались экранировать текст, или заменять двойную кавычку одинарной кавычкой, или заменить двойную кавычку на escape-символ: \ "

2 голосов
/ 19 сентября 2012

Просто чтобы уточнить последний ответ ... Объект будет оцениваться на стороне сервера, и, поскольку значение поля является строкой, любые двойные кавычки внутри него должны быть экранированы - как и \ ". Поскольку это также JS Escape вам нужно экранировать оба символа в \\ "

$("#txtInput").val().replace(/\"\g, "\\\"") 
0 голосов
/ 24 марта 2015

Я сталкиваюсь с той же проблемой. И это мое решение:

$.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>

желаю, чтобы это было полезно.

OR

мы можем использовать escape(result) на стороне клиента javascript. И используйте Microsoft.JScript.GlobalObject.unescape(data) на стороне сервера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...