簡體   English   中英

JSON,AJAX和ASP.NET

[英]JSON, AJAX, and ASP.NET

我的客戶端文件在其jQuery中有一個ajax調用,該調用將JSON數據發送到服務器端WebMethod。 以下代碼有效:

服務器端的WebMethod(C#)

[System.Web.Services.WebMethod]
public static string GetCurrentTime(string[] name)
{
    string str = "";
    foreach(string s in name)
    {
        str += s;
    }
    return str;
}

和ajax調用(jQuery):

        //array = ["a","b","c"]
        //data = {'name':["a","b","c"]}
        $.ajax({
            type: "POST",
            url: "schedule.aspx/GetCurrentTime",
            data: "{'name':" + JSON.stringify(array) + "}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response){
                alert(response.d);
            },
            complete: function () {
                alert("complete");
            }
        });

tl; dr上面的代碼采用JSON字符串,並在服務器端方法中創建字符串數組。

如果將JSON更改為以下內容,將如何重寫上述WebMethod? “名稱”不再像上面的代碼中那樣是字符串數組,而是某些對象的數組,因此需要更改WebMethod中的參數類型,但是我不確定該怎么做。

{"name":[{"value":"val1"},{"value":"val2"}]}

這是我執行ajax請求時在Chrome的“網絡”標簽上收到的消息和stacktrace:

Message
:
"No parameterless constructor defined for type of 'System.String'."
StackTrace
:
"   at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
↵   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
↵   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
↵   at System.Web.Script.Serialization.ObjectConverter.AddItemToList(IList oldList, IList newList, Type elementType, JavaScriptSerializer serializer, Boolean throwOnError)
↵   at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertedList)
↵   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
↵   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
↵   at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams)
↵   at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)
↵   at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)
↵   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)"

如果您想將復雜的對象發送到您的網絡方法,例如。 {"value":"val1"}那么您需要創建一個具有與JSON匹配的屬性的C#類,以便能夠接收數據。

因此,在您的情況下,您需要一個數據類,例如:

public class ValueObject
{
    public string Value { get; set; }
}

然后,您需要更改您的網絡方法以接受ValueObject數組:

[System.Web.Services.WebMethod]
public static string GetCurrentTime(ValueObject[] name)
{
    string str = "";
    foreach (var s in name)
    {
        str += s.Value;
    }
    return str;
}

請注意,屬性名稱Value必須與JSON value中的屬性名稱匹配

如果您想將{"name":[{"value":"val1"},{"value":"val2"}]}值設置為Web方法,則創建一個數據模型,如下所示

 public class Name
    {
        public string value { get; set; }
    }

    public class RootObject
    {
        public List<Name> name { get; set; }
    }

並如下更改您的頁面方法簽名

[WebMethod]
[ScriptMethod]
public static string GetCurrentTime(RootObject list)
{
    string str = "";
    foreach (var s in list.name)
    {
        str += s.Value;
    }
    return str;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM