我有一个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成功函数中的所有内容,但它仍然失败了。所以问题在于传回课程。有什么想法吗?
答案 0 :(得分:0)
通过Jquery ajax传递JSON.stringify数据,但在你的方法中你将它作为普通字符串
答案 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');
}
});