1

で説明したのとほぼ同じように、MVC3 を使用してカスケード ドロップダウン リストを実装しました。

C# を使用して ASP.NET MVC 3 でカスケード ドロップダウンを作成する最も簡単な方法

私の見解はそうでした

<script type="text/javascript">
    $(function () {
        $('#CategoryID').change(function () {
            var selectedCategoryId = $(this).val();
            $.getJSON('@Url.Action("SelectCategory")', { categoryid: selectedCategoryId }, function (subcategories) {
                var subsSelect = $('#SubCategoryID');
                subsSelect.empty();
                $.each(subcategories, function (index, subcat) {
                    subsSelect.append(
                        $('<option/>')
                            .attr('value', subcat.SubCategoryID)
                            .text(subcat.SubCategoryName)
                    );
                });
            });
        });
    });
</script>

私のコントローラーにはそれがありました

public ActionResult SelectCategory(int categoryid)
{
    var subs = db.SubCategories.Where(s => s.CategoryID == categoryid).ToList();
    return Json(subs, JsonRequestBehavior.AllowGet);
}

そして、それはうまくいきませんでした。

ただし、コントローラーを次のように変更すると機能しました。

public class JsonSubCat
{
    public int SubCategoryID { get; set; }
    public string SubCategoryName { get; set; }
}

public ActionResult SelectCategory(int categoryid)
{
    var subs = db.SubCategories.Where(s => s.CategoryID == categoryid).ToList();
    var testsubs = new List<JsonSubCat>();

    foreach (var sub in subs)
    {
        testsubs.Add(new JsonSubCat() { SubCategoryID = sub.SubCategoryID, SubCategoryName = sub.SubCategoryName });
    }

    return Json(testsubs, JsonRequestBehavior.AllowGet);
}

データ ソースから取得したエンティティを適切な形式に変換する問題のようです。これを実装する正しい方法は何でしょうか?

4

1 に答える 1

3

これを実装する正しい方法は何でしょうか?

ドメイン エンティティに循環参照があると思われます。JSON 形式は循環構造をサポートしていないため、これは JSON シリアライザーではサポートされていません。

ドメイン モデルをビューに渡すべきではありません。これをやめて、ビューモデルを使用してください。subsこのビューが気にするのはテキストと値のコレクションだけなのに、エンティティ全体をビューに渡すのはなぜですか? ドロップダウン リストに必要なのはこれだけです。

したがって、ビューモデルを使用してください。もちろん、すでに作成したことは言うまでもありません=>JsonSubCat素晴らしいクラスです。

public ActionResult SelectCategory(int categoryid)
{
    var subs = db.SubCategories
        .Where(s => s.CategoryID == categoryid)
        .ToList()
        .Select(x => new JsonSubCat
        {
            SubCategoryID = x.SubCategoryID,
            SubCategoryName = x.SubCategoryName
        });
    return Json(subs, JsonRequestBehavior.AllowGet);
}
于 2012-07-09T06:25:28.133 に答える