簡體   English   中英

返回自定義對象列表的對ASP.NET C#方法的Ajax調用

[英]Ajax call to asp.net c# method returning custom object list

我正在嘗試調用此WebMethod:

[System.Web.Services.WebMethod]
public static List<CustomObject> Carica(int ID)
{
    List<CustomObject> elenco = new List<CustomObject>();
    try
    {
        elenco = GetElencoByID(ID);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return elenco;
}

使用Ajax:

function caricaElenco(ID) {
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "nomePagina.aspx/Carica",
        data: '{ID:' + ID + '}',
        dataType: "json",
        success: function (response) {
            for (var i = 0; i < response.d.length; i++) {
                alert(response.d[i].nomeCampo);
            }
        },
        error: function (result) {
            alert("Errore! " + result.status + " - " + result.statusText);
        }
    });
}

但是,即使調試服務器代碼,我總是遇到錯誤500,他在做他的工作並返回列表。.如果我只是為了測試而修改返回單個對象的函數,請執行以下操作:

public static CustomObject Carica(int ID)
    {
        (...)
        return elenco[0];
    }

我能夠做到:

success: function (response) {
            alert(response.d.nomeCampo);                    
        }
    },

它正在工作! 我也嘗試將方法簽名更改為:

public static IENumerable<CustomObject> Carica(int ID)

但還是沒有運氣。.關於ajax和自定義對象列表的問題(對象是[可序列化]?

更新:

現在我已經:

[System.Web.Services.WebMethod]
public static void Carica(int ID)
{
    List<CustomObject> elenco = new List<CustomObject>();
        try
        {
            elenco = GetElencoByID(ID);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        System.Web.Script.Serialization.JavaScriptSerializer jSearializer =
               new System.Web.Script.Serialization.JavaScriptSerializer();

        string result = jSearializer.Serialize(flussi);
        System.Web.HttpContext.Current.Response.ContentType = "application/json";
        System.Web.HttpContext.Current.Response.Write(result);
        System.Web.HttpContext.Current.Response.End();
    }

但是仍然出現“ Errore!500-Internal Server Error”,但是調試服務器代碼時沒有錯誤,我可以在結果值中看到[{“ ID”:1,“ campo1”:null,“ campoData”:“ / Date(1410166675790) /","campoInt":3858.62},{"ID":2,"campo1":null,"campoData":"/Date(1410166675790)/","campoInt":3858.62}(...)]。
如果我評論Response.End()(只是嘗試),我會收到“ Errore!200-OK”

更新2:

好的,我已經安裝了Fiddler,錯誤500實際上是指Response.End()附帶的ThreadAbortException。 使用返回List的方法返回原始代碼,這是一個真正的問題...異常消息:使用JSON JavaScriptSerializer進行序列化或反序列化時出錯。 字符串的長度超過了在maxJsonLength屬性上設置的值。

更新3:

好的,我已經看到了: Ajax請求返回200好的,但是會引發錯誤事件而不是成功,並且這是: jQuery AJAX狀態為“ 200好的”,但是沒有數據響應說明為什么我得到了確定,但未成功注釋Response.End()..我不知道是否可以將整個列表放在JSON中,同時還將maxJsonLength設置為Int32.MaxValue,因為實際上是2437個元素的列表,其中包含很多字段。

使用WebMethod時,我發現有時必須強制其返回JSON。 您將失去內容協商(除非您手動實施協商)。 我仍然建議盡可能切換到Web API 但這應該可以解決問題。

[System.Web.Services.WebMethod]
public static void Carica(int ID)
{
    List<CustomObject> elenco = new List<CustomObject>();
    try
    {
        elenco = GetElencoByID(ID);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    Response.ContentType = "application/json";
    Response.Write(JsonConvert.SerializeObject(elenco)); //using JSON.NET, but any serializer should do
    Response.End();
}

因此,對於返回類型,將其切換為void。 然后,將響應的內容類型設置為JSON。 然后,將“返回對象”手動轉換為JSON並將其寫入響應,然后結束響應。

在Web.Config中進行設置:

<system.web.extensions>
    <scripting>
      <webServices>
          <jsonSerialization maxJsonLength="2147483647"/>
      </webServices>
    </scripting>
</system.web.extensions>

基於此:

我可以在web.config中為maxJsonLength設置無限長度嗎?

現在,它可以與原始的WebMethod一起使用。

暫無
暫無

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

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