0

我在使用 jQuery 和 AJAX 在 MVC4 razor 中获取自动完成搜索表单时遇到问题。

我的 HTML 表单

    @using (Html.BeginForm())
    {
        @Html.TextBox("FriensList")
        <input type="submit" value="Go" />
    }

我的 JS 脚本

$(document).ready(function () {
    $("#FriensList").autocomplete({
        source: function(request,response) {
            $.ajax({
                url: "/User/FriendList",
                type: "POST",
                dataType: "json",
                data: { term: request.term },
                success: function (data) {
                    response($.map(data, function (item) {
                        return { label: item.label };
                    }))
                }
            })
        },
        minLength: 1,
        delay: 1000
    });
})

和我的控制器

public ActionResult FriendList(string term)
    {
        using (var db = new dbContext())
        {
            var result = db.UserProfiles
                .Where(r => r.FirstName.Contains(term))
                .Take(10)
                .Select(r => new {label = r.FirstName});

            return Json(result, JsonRequestBehavior.AllowGet);
        }
    }

调试代码,可以看到我在搜索框中输入一个字母就进入了action,从数据库中返回了正确的数据,但是当ajax收到响应时,好像报了500错误。

我已确保在 js 捆绑之后加载我的脚本,并按照之前提出的类似问题中的建议添加了 minLength 和 Delay 参数。

谢谢你的帮助。

编辑 1

我将控制器更改为

public ActionResult FriendList(string term)
    {
        using (var db = new dbContext())
        {
            var result = db.UserProfiles
                .Where(r => r.FirstName.Contains(term))
                .Take(10)
                .Select(r => new {label = r.FirstName});

            var ser = new JavaScriptSerializer();
            var tests = ser.Serialize(result);

            return Json(tests, JsonRequestBehavior.AllowGet);
        }
    }

现在,当我搜索时,我会在搜索框下看到一堆 li 标签。它不打印任何文本,但似乎在重复某些不是结果的内容

编辑 2

我将返回更改为

return Json(tests, "Label", JsonRequestBehavior.AllowGet);

和下面的ajax

return { label: item};

现在它在单独的行中打印出每个单独的字符,包括 json 括号

4

1 回答 1

1

Json方法在内部将数据序列化为 JSON 格式,因此您不必显式序列化数据。

//var ser = new JavaScriptSerializer(); 
//var tests = ser.Serialize(result); 
return Json(result.ToList(),JsonRequestBehavior.AllowGet);

初稿不起作用,因为result它的类型IQueryable<T>不是数据而是查询表达式。要从查询表达式中显式收集数据,.ToList()需要调用方法,因此result.ToList().

希望这可以帮助。

于 2013-09-25T20:12:19.437 回答