0

ASP.NET MVC4 と Entity Framework を使用してイントラネット Web アプリに取り組んでいます。私の見解の 1 つとして、将来巨大になる可能性のある人物のリストがあります。そこで、作業を簡単にするために、jQuery UI と Json を使用してオートコンプリート フィールド コンポーネントを実装したいと考えました。

問題は、データベースを使用して jQuery コードにソースを提供しているときに、それが機能していないことです。ただし、データをハードコーディングして変数を作成すると、機能します。

私の行動:

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);
}

私の見解 :

@{
    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>
}

戻り値の型 (ActionResult ではなく JsonResult) を変更しようとしましたが、何も変わりません。この問題を解決するアイデアはありますか?

4

1 に答える 1

3

コードが機能しない理由は、オブジェクト グラフに循環参照が含まれている可能性が高く、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 オブジェクト全体を直接取得していました。

于 2013-04-03T07:59:12.403 に答える