MVC4 -使用Json自动完成

本文关键字:Json 使用 MVC4 | 更新日期: 2023-09-27 18:07:15

我正在使用ASP的内部网web应用程序工作。NET MVC4和实体框架。在我看来,我有一个名单,在未来可能是巨大的人。因此,为了使事情更简单,我想使用jQuery UI和Json实现一个自动完成字段组件。

事情是,当我使用我的数据库提供源代码,我的jQuery代码,它是不工作。但是,当我通过硬编码数据来创建变量时,它可以工作。

My Action:

public ActionResult AutoComplete(string term)
{
    BuSIMaterial.Models.BuSIMaterialEntities db = new Models.BuSIMaterialEntities();
    //var result = new [] {"A","B","C","D","E","F"}; with this, it works
    var result = (from obj in db.Persons where obj.FirstName.ToLower().Contains(term.ToLower()) select obj).ToArray(); // with this, it doesn't work
    return Json(result, JsonRequestBehavior.AllowGet);
}

My View:

@{
    ViewBag.Title = "Auto";
}
<h2>Auto</h2>
<label for="persons">Persons : </label><input type="text" id="persons" name="persons"/>
@section Scripts
{
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/themes/base/css")
    <script type="text/javascript" language="javascript">
        $(document).ready(function () {
            $('#persons').autocomplete({
                source: '@Url.Action("AutoComplete")'
            });
        });
    </script>
}

我试图修改我的返回类型(JsonResult而不是ActionResult),但没有任何变化。有解决这个问题的办法吗?

MVC4 -使用Json自动完成

你的代码不工作的原因是因为你正试图发送一个域模型的视图,最有可能包含循环引用在其对象图和不是JSON序列化。要解决这个问题,可以这样做:

public ActionResult AutoComplete(string term)
{
    BuSIMaterial.Models.BuSIMaterialEntities db = new Models.BuSIMaterialEntities();
    //var result = new [] {"A","B","C","D","E","F"}; with this, it works
    var result = db
        .Persons
        .Where(p => p.FirstName.ToLower().Contains(term.ToLower()))
        .Select(p => p.FirstName) // <!-- That's the important bit you were missing
        .ToList();
    return Json(result, JsonRequestBehavior.AllowGet);
}

请注意我是如何将Person实体投影到一个字符串(仅取其FirstName)的。在您的示例中,您直接采用整个Person对象,这对于自动完成插件来说没有意义,因为您需要将字符串数组发送到视图。