我正在构建我的第一个MVC应用程序并遇到尝试使用AJAX / JSON执行搜索的问题。问题似乎是我的控制器返回的JSON不是一个数组,这意味着我不能使用jQuery的$ .each方法迭代我的项目。我正在尝试通过电子邮件地址搜索用户。
我有一个SearchController类,使用以下方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SearchByEmail(string searchString)
{
var users = new List<jsonUser>();
foreach (I_User u in _rep.SearchByEmail(searchString))
{
users.Add(new jsonUser()
{
EmailAddress = u.EmailAddress,
FirstName = u.Firstname,
LastName = u.Surname,
UserName = u.Username
});
}
return Json(users);
}
正确触发并返回一些看起来像我JSON数组的东西:
[{"EmailAddress":"foo@bar.com","UserName":"foo@bar.com","FirstName":"Foo","LastName":"Bar"}]
然后在我的页面中,我有以下代码:
$("#search").click(function(evt) {
var emailsearch = jQuery.trim($("#email").val());
$.post("/Search/SearchByEmail", { searchString: emailsearch },
function(Users) {
$("#jsonlist").text(Users); //Added to check what JSON returns.
alert($.isArray(Users)); //Added to work out if jQuery thinks this is an array!
$.each(Users, function() {
//Do stuff on each user item
});
});
});
});
通过添加上面的注释行,我已经确定这个函数正在获得一个明智的结果(上面发布的JSON),但它认为这不是一个数组。因此,$ .each循环中的$(this)是未定义的。
我从NerdDinner应用程序中借用了大量的这些,实际上看不出有什么区别。任何建议都非常感谢!
答案 0 :(得分:3)
如果您要返回JSON,您是否尝试将相关数据类型参数添加到$ .post调用的参数中?
$.post("/Search/SearchByEmail",
{ searchString: emailsearch }, callback, "json");
帖子通常会默认为Html或文字,因此它不会执行“反序列化”帖子正文所需的eval。
答案 1 :(得分:1)
我认为你需要eval()响应以使其正确。尝试类似:
$("#search").click(function(evt) {
var emailsearch = jQuery.trim($("#email").val());
$.post("/Search/SearchByEmail", { searchString: emailsearch },
function(data) {
$("#jsonlist").text(data); //Added to check what JSON returns.
Users = eval( '(' + data + ')' );
alert($.isArray(Users)); //Added to work out if jQuery thinks this is an array!
$.each(Users, function() {
//Do stuff on each user item
});
});
});
});