jQuery ajax webmethod错误

时间:2014-01-27 07:44:08

标签: c# jquery asp.net ajax webmethod

我有一个webmethod返回一个对象,我很难访问从jQuery Ajax方法返回的对象。我想访问HighlightResults并在转发器中显示。我一直收到错误:处理请求时出错。内部服务器错误。

我的目标是:

  public class SearchResults
  {
    internal SearchResults()
    {

    }

    public virtual IQueryable<Document> DocumentResults { get; internal set; }
    public virtual IQueryable<Page> PageResults { get; internal set; }
    public virtual IQueryable<Word> WordResults { get; internal set; }
    public ICollection<String> HighlightResults { get; internal set; }
    public int QueryTime { get; internal set; }
    public int TotalResults { get; internal set; }

}

我的ajax功能:

var query = String($('[id$=txtSearch]').val());            
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "Viewer.aspx/GetHighlightResults",
            dataType: "json",
            data: JSON.stringify({docID: docid, query: query, 
                  pageNumber: 1, resultsPerPage: 10}),
            success: function (response) {
                alert("Success!!");                 
                var data = response.d;

                // none of these are displaying....
                alert(String(data));
                alert(String(data.HighlightResults));
                alert(String(data.HighlightResults[0]));

                $.each(data, function(index, item) {
                    alert(item);
                    alert(item.HighlightResults);

                    $("#search-results").append("<b>" + item + "</b>");
                })
            },
            error: function (xhr, status, error) {
                alert("responseText=" + xhr.responseText + 
                      "\n textStatus=" + status + "\n errorThrown=" + error);
            }
        });

最后,我的网络方法:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static SearchResults GetHighlightResults(String docID, String query, 
                  String pageNumber, String resultsPerPage)
    {
        SearchResults results = null;
        try
        {
            ArchiveSearcher searcher = new ArchiveSearcher();
            if (!String.IsNullOrEmpty(query) && Convert.ToInt32(docID) > 0 && 
                Convert.ToInt32(pageNumber) > 0 && Convert.ToInt32(resultsPerPage) > 0)
            {
                results = searcher.SearchDocument(Convert.ToInt32(docID), query, 
                Convert.ToInt32(pageNumber), Convert.ToInt32(resultsPerPage)); 
            }
        }
        catch (Exception ex)
        {
            // Log the exception.
            ArchiveViewer.Logic.ExceptionUtility.LogException(ex, "GetSearchResults in Viewer.aspx.cs");
        }
        return results;
    }

非常感谢帮助。

编辑:如果我从Web方法返回ICollection<String> Highlight结果,我可以使用以下命令从jquery ajax函数访问它:

success: function (response) {
    var data = response.d;
    $.each(data, function(index, item) {
         alert(item);
....

我认为我的问题与我如何访问整个SearchResults对象有关。关于我做错了什么的想法?

编辑2:我已经注释掉了我的ajax成功函数中的所有内容,但它仍然失败了。所以问题在于传回课程。有什么想法吗?

4 个答案:

答案 0 :(得分:0)

通过Jquery ajax传递JSON.stringify数据,但在你的方法中你将它作为普通字符串

检查该参考链接https://stackoverflow.com/a/6323528/2641723

答案 1 :(得分:0)

我在测试项目中做了同样的事情并且它返回了成功。我可以看到警报发射:

这是我在对象中更改的内容:

  public virtual IQueryable<string> DocumentResults { get; internal set; }
  public virtual IQueryable<Page> PageResults { get; internal set; }
  public virtual IQueryable<string> WordResults { get; internal set; }

然后在ajax:

  data: JSON.stringify({
                docID: 'test',
                query: 'tet2',
                pageNumber: 1,
                resultsPerPage: 10
            }),

和:

[WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public static SearchResults GetHighlightResults(String docID, String query,
                      String pageNumber, String resultsPerPage)
        {
            SearchResults results = null;
            try
            {
                 results = new SearchResults();
            }
            catch (Exception ex)
            {
                // Log the exception.
                //ArchiveViewer.Logic.ExceptionUtility.LogException(ex, "GetSearchResults in Viewer.aspx.cs");
            }
            return results;
        }

我建议你检查一下webmethod中没有任何例外。

答案 2 :(得分:0)

唉唉!!!我想到了。谢谢Zaki,你把我推向正确的方向!!

我在Web方法中没有任何错误,但是当我的对象被序列化为JSON时发生了异常。问题在于我的课程中序列化IQueryable<T>。我已将其更改为List<T>,现在一切正常。 (我生命中的一天消失了!)

要完成,访问客户端中返回的对象的正确方法是:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "Viewer.aspx/GetSearchResults",
    dataType: "json",
    data: JSON.stringify({ docID: docid, query: query, pageNumber: 1, resultsPerPage: 10 }),
    success: function (response) {
        var data = response.d.HighlightResults;
        $.each(data, function (index, item) {
            $("#search-results").append("<b>" + item + "</b>");
        })
    } 
......

答案 3 :(得分:0)

我遇到了类似的问题,发布了我的解决方案:

jsp文件:

<c:forEach var="myMap" items="${myMap}" varStatus="status">
        <tr><td>
                ${myMap.key}
            <c:forEach var="info" items="${myMap.value}">
                URL ${info}
                <select id="dropdown" name="dropdown">
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>

                </select>
                <button type="button" onclick="test()">Update</button>

            </c:forEach>
        </td></tr>
    </c:forEach>

控制器文件:

 @RequestMapping(value = "postData", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
public String putService(@RequestBody HashMap<String, String> myMap) {
 // perform operations  
  return String;
}

js文件:

function test(){
    $.ajax({
        url: 'your url',
        type: 'PUT',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: JSON.stringify({"Key":"Value"}),
        success: function(data) {
            alert('Operation Success');
        }
    });