문제

jQuery의 Ajax 호출에서 오류가 발생합니다.

내 jQuery 기능은 다음과 같습니다.

function DeleteItem(RecordId, UId, XmlName, ItemType, UserProfileId) {
    var obj = {
        RecordId: RecordId,
        UserId: UId,
        UserProfileId: UserProfileId,
        ItemType: ItemType,
        FileName: XmlName
    };
    var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);

    $.ajax({
        type: "POST",
        url: "EditUserProfile.aspx/DeleteRecord",
        data: json,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        cache: false,
        success: function(msg) {
            if (msg.d != null) {
                RefreshData(ItemType, msg.d);
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("error occured during deleting");
        }
    });
}

그리고 이것은 나의 것입니다 WebMethod:

[WebMethod]
public static string DeleteRecord(Int64 RecordId, Int64 UserId, Int64 UserProfileId, string ItemType, string FileName) {
    try {
        string FilePath = HttpContext.Current.Server.MapPath(FileName);

        XDocument xmldoc = XDocument.Load(FilePath);
        XElement Xelm = xmldoc.Element("UserProfile");
        XElement parentElement = Xelm.XPathSelectElement(ItemType + "/Fields");

        (from BO in parentElement.Descendants("Record")
         where BO.Element("Id").Attribute("value").Value == RecordId.ToString()
         select BO).Remove();
        XDocument xdoc = XDocument.Parse(Xelm.ToString(), LoadOptions.PreserveWhitespace);
        xdoc.Save(FilePath);

        UserInfoHandler obj = new UserInfoHandler();
        return obj.GetHTML(UserId, UserProfileId, FileName, ItemType, RecordId, Xelm).ToString();
    } catch (Exception ex) {
        HandleException.LogError(ex, "EditUserProfile.aspx", "DeleteRecord");
    }
    return "success";
}

누구든지 내 코드에서 무엇이 잘못되었는지 말해 줄 수 있습니까?

이 오류가 발생합니다.

{
    "Message":"Invalid JSON primitive: RecordId.",
    "StackTrace":"
       at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()
       at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
       at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
       at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
       at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)
       at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)
       at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)
       at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)",
    "ExceptionType":"System.ArgumentException"
}
도움이 되었습니까?

해결책

변수가 무엇인지 추측합니다 json 후에 포함

var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);?

유효한 JSON 객체와 같은 경우 {'foo':'foovalue', 'bar':'barvalue'} 그러면 jQuery는 JSON 데이터로 보내지 않고 대신 직렬화 할 수 있습니다. foor=foovalue&bar=barvalue 따라서 오류가 발생합니다 "Invalid JSON primitive: foo"

대신 데이터를 문자열로 설정하십시오

$.ajax({
    ...
    data: "{'foo':'foovalue', 'bar':'barvalue'}", //note the additional quotation marks
    ...
})

이런 식으로 jQuery는 데이터를 내버려두고 서버로 문자열을 보내야합니다.

다른 팁

사용

data : JSON.stringify(obj)

위의 상황에서 나는 내가 믿었을 것이다.

참고 : JSON2.JS 라이브러리를 추가해야합니다. 모든 브라우저는 해당 JSON 객체 (IE7-)를 지원하지 않습니다.JSON.JS와 JSON2.JS의 차이

지터가 언급 한 바와 같이 $.ajax 함수는 data URL 인코딩 형식으로 매개 변수. 이상하게도, dataType 매개 변수는 요청의 데이터가 아닌 서버의 응답에만 적용됩니다.

내가 다운로드하고 사용했던 것과 동일한 문제를 발견 한 후 jQuery-JSON 플러그인 요청 데이터를 ScriptService에 올바르게 인코딩합니다. 그런 다음 사용했습니다 $.toJSON 기능 서버로 보낼 원하는 인수를 인코딩하는 기능 :

$.ajax({
    type: "POST",
    url: "EditUserProfile.aspx/DeleteRecord",
    data: $.toJSON(obj),
    contentType: "application/json; charset=utf-8",
    dataType: "json"
    ....
});

이런 식으로 작동합니다

data: JSON.stringify({'id':x}),

jQuery ajax는 다음과 같은 쿼리 문자열 매개 변수로 데이터를 기본값으로 전송합니다.

RecordId=456&UserId=123

그렇지 않다면 processData 옵션은 False로 설정되며,이 경우 서버로 객체로 전송됩니다.

  • contentType 옵션은 형식 클라이언트가 데이터를 보낸 서버에 대한 옵션입니다.

  • dataType 옵션은 서버에서 어떤 유형의 데이터 클라이언트가 서버에서 기대하고 있음을 알려주는 옵션입니다.

서버가 JSON이 아닌 쿼리 문자열 매개 변수로 구문 분석되도록 ContentType를 지정하지 마십시오.

또는

ContentType를 'Application/JSON; charset = utf-8 '이고 json.stringify (객체)를 사용하여 서버가 String에서 json을 사로화 할 수 있도록하십시오.

@jitter가 그의 추측에 옳다고 생각하지만 그의 해결책은 저에게 효과가 없었습니다.

다음은 효과가 있습니다.

$.ajax({
    ...
    data: "{ intFoo: " + intFoo + " }",
    ...
});

나는 시도하지 않았지만 매개 변수가 문자열이라면 다음과 같아야한다고 생각합니다.

$.ajax({
    ...
    data: "{ intFoo: " + intFoo + ", strBar: '" + strBar + "' }",
    ...
});

나는 같은 문제에 직면하고 있었는데, 좋은 솔루션과 함께 온 것은 다음과 같습니다.

이 시도...

$.ajax({
    type: "POST",
    url: "EditUserProfile.aspx/DeleteRecord",
    data: '{RecordId: ' + RecordId + ', UserId: ' + UId + ', UserProfileId:' + UserProfileId + ', ItemType: \'' + ItemType + '\', FileName: '\' + XmlName + '\'}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: true,
    cache: false,
    success: function(msg) {
        if (msg.d != null) {
            RefreshData(ItemType, msg.d);
        }
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("error occured during deleting");
    }
});

문자열 값으로 표시하기 위해 사용한 ( ') 탈출 시퀀스 문자에 대해서는 여기에 참고하십시오.

JSON을 수동으로 포맷하는 경우 여기에는 매우 편리한 유효성 검사기가 있습니다. jsonlint.com

단일 따옴표 대신 이중 인용문을 사용하십시오.

유효하지 않은:

{
    'project': 'a2ab6ef4-1a8c-40cd-b561-2112b6baffd6',
    'franchise': '110bcca5-cc74-416a-9e2a-f90a8c5f63a0'
}

유효한:

{
    "project": "a2ab6ef4-1a8c-40cd-b561-2112b6baffd6",
    "franchise": "18e899f6-dd71-41b7-8c45-5dc0919679ef"
}

서버에서 json을 사용자 정의 객체로 직렬화/사형화하기 위해 :

public static string Serialize<T>(T obj)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string retVal = Encoding.UTF8.GetString(ms.ToArray());
    return retVal;
}

public static T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    return obj;
}

나는 같은 문제가 있었다. 팝업 창에서 부모 페이지를 "저장"에 전화했습니다. 내가 사용하고 있음을 발견했습니다 ClientIDMode="Static" 동일한 제어 ID가있는 부모와 팝업 페이지에서. 풀이 ClientIDMode="Static" 페이지 중 하나에서 문제를 해결했습니다.

이 답변으로 인해 유효하지 않은 매개 변수와 누락 된 매개 변수 사이를 오가는 것이 방금 튀어 나왔습니다.

이것은 나에게 효과가 있었고, 그냥 인용구로 문자열 변수를 랩핑했습니다 ...

data: { RecordId: RecordId,
            UserId: UId,
            UserProfileId: UserProfileId,
            ItemType: '"' +  ItemType + '"',
            FileName: '"' +  XmlName + '"'
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top