0

カスケードで3つのドロップダウンリストを作成したい3つのドロップダウンリストがあります。データベースにLinqSqlを使用しています..

Product(id,name)、Design(id,master_id,name)、Model(id,design_id,name) master_id が Product(id) にバインドされ、design_id が Design(id) にバインドされた 3 つのテーブルがあります。

製品を表示するドロップダウンを1つ作成したいのですが、製品を選択するとデザインドロップダウンが有効になり、そうでない場合は無効のままになります..また、ここで解決できなかったトリッキーな部分があり、ここで3番目を作成する際に大きな説明が必要ですデザインが選択されるまで通常は無効になるドロップダウン。

それらのそれぞれは、それらにバインドされた下のドロップダウンリストに入力します。製品はデザインを有効にして入力し、デザインはモデルを有効にして入力します。私は2つのドロップダウンでそれを行うことができますが、3つのドロップダウンになると、私は本当にひどく立ち往生しています(脳凍結)..

私はすでに他の質問をチェックして、自分の解決策を見つけることができませんでした。私がLinqSqlを使用して言ったように、このタイプのデータリーチには3つのカスケードドロップダウンリストに関するソリューションが必要です。

あなたにできることは何でもありがとう!Model-View-Controller パーシャルとパラメーター、およびそれらを使用する理由を説明できれば、それは素晴らしいことです。このMVC3の初心者です。

4

2 に答える 2

2

私は次のような問題に取り組みます:

まず、コントローラーで、次のメソッドを設定します。

public JsonResult GetDesignsForProduct(int productId)
{
  // Instantiate our context and do whatever goo we need to select the objects we want
  using (MyDatabaseContext ctx = new MyDatabaseContext())
  {
     return Json(ctx.Designs.Where(d => d.master_id == productId).ToList(), JsonRequestBehavior.AllowGet);
  }
}

public JsonResult GetModelsForDesign(int designId)
{
  // Instantiate our context and do whatever goo we need to select the objects we want
  using (MyDatabaseContext ctx = new MyDatabaseContext())
  {
     return Json(ctx.Models.Where(d => d.design_id == designId).ToList(), JsonRequestBehavior.AllowGet);
  }
}

ここで「get」をオンにしました。データに機密情報 (ユーザー名/電子メール アドレス、その他の専有データまたは法的に保護されたデータなど) が含まれている場合は、これを変更して「投稿」のみを許可し、それに応じて Javascript を変更できます。Phil Haack の記事を参照してください。

また、このデータが頻繁に変更されることが予想される場合、これらのメソッドは、アプリケーションのキャッシュ設定に従ってデフォルトでデータをキャッシュします。OutputCacheメソッドに属性を追加して、この動作を変更できます。

次に、ビューには次のような AJAX 配管が表示されます。

function LoadDesigns() {
    // Get the currently-selected value in our Product dropdown
    var prod = $("#Product").val();

    // Call our controller method and process the list of Design objects
    $.getJSON('@Url.Content("~/ControllerName/GetDesignsForProduct")', { productId: prod },
        function (designs) {
            $("#Design").empty();
            $.each(designs, function (i, c) {
                $("#Design").append(
                    $('<option></option>').val(c.id).html(c.name)
                );
            });
    });
}

function LoadModels() {
    // Get the currently-selected value in our Design dropdown
    var des = $("#Design").val();

    // Call our controller method and process the list of Model objects
    $.getJSON('@Url.Content("~/ControllerName/GetModelsForDesign")', { designId: des },
        function (models) {
            $("#Model").empty();
            $.each(models, function (i, c) {
                $("#Model").append(
                    $('<option></option>').val(c.id).html(c.name)
                );
            });
    });
}

最後に、3 つのドロップダウンすべてを次のように定義します。

@Html.DropDownList("Product", productSelectList, new { onchange = "LoadDesigns()" })
@Html.DropDownList("Design", null, new { onchange = "LoadModels()" })
@Html.DropDownList("Model")

HTML ヘルパーは実際には基になる HTML を生成するためのショートカットにすぎないことを忘れないでください。Razor では、ヘルパーを操作する代わりに、HTML に直接アクセスすることがよくあります。したがって、これらを次のように簡単に書くことができます。

<select id="Product" onchange="LoadDesigns()">
  @foreach (var prod in products) {
    <option value="@prod.id">@prod.name</option>
  }
</select>

<select id="Design" onchange="LoadModels()"></select>

<select id="Model"></select>
于 2011-08-01T21:32:54.163 に答える
1

私の完成した作品を設定するのを忘れて..人々はそれがどのように起こるかを見たいと思うかもしれません..これが私のものです:

ビュー + Jquery

$(function () {
    $("select#Design").attr('disabled', 'true');
    $("select#Model").attr('disabled', 'true');

    $("select#Product").click(function () {
        var prod = $("select#Product option:selected").val();
        if (prod == "" || prod == 0) {
            $("select#Design").attr('disabled', 'true');
            $("select#Model").attr('disabled', 'true');
        } else {
            $.getJSON('@Url.Content("~/Admin/GetDesigns/")', { productId: prod }, function (data) {
                $("select#Design").empty();
                $("select#Model").empty();
                $.each(data, function (i, c) {
                    $('select#Design').append('<option value="' + c.Value + '">' + c.Text + '</option>');
                })
                $("select#Design").removeAttr('disabled');
                $("select#Design option:first").attr('selected', 'selected');

                var des = $("select#Design option:selected").val();
                if (des == "" || des == 0) {
                    $("select#Model").attr('disabled', 'true');
                } else {
                    $.getJSON('@Url.Content("~/Admin/GetModels/")', { designId: des }, function (data) {
                        $("select#Model").empty();
                        $.each(data, function (i, c) {
                            $('select#Model').append('<option value="' + c.Value + '">' + c.Text + '</option>');
                        })
                        $("select#Model").removeAttr('disabled');
                        $("select#Model option:first").attr('selected', 'selected');
                     })
                  }
               })
            }
         })
     })

このようにJqueryを使用してすべてのドロップダウンを埋め、最初の要素をデフォルトの選択として選択する理由! 最初のドロップダウンから要素を選択すると、他の2つのドロップダウンがそれ自体を埋め始め、最初の要素をデフォルトの選択として選択します..同じコードを他のドロップダウンクリック機能に使用できます:

            $("select#Design").click(function () {
                var des = $("select#Design option:selected").val();
                if (des == "" || des == 0) {
                    $("select#Model").attr('disabled', 'true');
                } else {
                    $.getJSON('@Url.Content("~/Admin/GetModels/")', { designId: des }, function (data) {
                        $("select#Model").empty();
                        $.each(data, function (i, c) {
                            $('select#Model').append('<option value="' + c.Value + '">' + c.Text + '</option>');
                        })
                        $("select#Model").removeAttr('disabled');
                        $("select#Model option:first").attr('selected', 'selected');
                    })
                }
           });

意見

@using (Html.BeginForm("Index", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<table>
    <tr>
        <td style="background-color:#e8eef4;" rowspan="3">
        </td>
        <td style="width:190px; background-color:#e8eef4;">
            @Html.DropDownList("Product", (SelectList)ViewData["ProductList"], "Please Select Product", new { style = "width:190px; padding:4px; margin:4px;" })
        </td>
        <td rowspan="3" style="width:400;">
        </td>
        <td style="background-color:#e8eef4;">
        </td>
        <td style="background-color:#e8eef4;" rowspan="3">
        </td>
    </tr>
    <tr>
        <td style="background-color:#e8eef4;">
            <select id="Design" style="width:190px; padding:4px; margin:4px;">
            <option label="Please Select Design" selected="selected"></option>
            </select>
        </td>
        <td style="background-color:#e8eef4;">
        </td>
    </tr>
    <tr>
        <td style="background-color:#e8eef4;">
            <select id="Model" style=" width:190px; padding:4px; margin:4px;">
            <option label="Please Select Model"></option>
            </select>
        </td>
        <td style="background-color:#e8eef4;">
        </td>
    </tr>
</table>
}

単に linqtosql を使用しており、レポジトリを作成するのが面倒なだけです..これは私のコントローラーです

public class AdminController : Controller
{
    public linqVipDataContext db = new linqVipDataContext();

    //
    // GET: /Admin/
    public ActionResult Index()
    {
        IEnumerable<SelectListItem> ProductItems = db.Products.AsEnumerable().Select(c => new SelectListItem()
        {
            Text = c.name,
            Value = c.id.ToString(),
            Selected = true,
        });
        SelectList prod = new SelectList(ProductItems, "Value", "Text");
        ViewBag.ProductList = prod;
        return View();
    }


    //
    //Fill the Design List..
    public JsonResult GetDesigns(int productId)
    {
        /*var data = dbs.Designs.Where(d => d.master_id == productId).ToList();*/

        IEnumerable<SelectListItem> DesignItems = db.Designs.Where(c => c.master_id == productId).AsEnumerable().Select(c => new SelectListItem()
        {
            Text = c.name,
            Value = c.id.ToString()
        });
        SelectList des = new SelectList(DesignItems, "Value", "Text");
        return Json(des, JsonRequestBehavior.AllowGet);
    }

    //
    //Fill the Model List..
    public JsonResult GetModels(int designId)
    {   
        /*This code down here! Doesnt work and says it's type is unknown*/
        /*var data = dbs.Models.Where(d => d.design_id == designId).ToList();*/

        /*For that reason im using this code*/
        IEnumerable<SelectListItem> ModelItems = db.Models.Where(d => d.design_id == designId).AsEnumerable().Select(c => new SelectListItem()
        {
            Text = c.name,
            Value = c.id.ToString()
        });
        SelectList mods= new SelectList(ModelItems, "Value", "Text");
        return Json(mods, JsonRequestBehavior.AllowGet);
    }

Json では、selectlist オプションを作成するために、値とテキスト 2 のパラメーターを分離する必要があります。したがって、値をそのように返さなければなりません。

私はこの原因を投稿しました。あなたのコードでいくつかの故障を見つけました。この解決策を示してくれたおかげで、アイデアが得られ、すべての問題を解決できたので、これは完全に機能するコードです.. Ty 再び。その有用性を願っています。

于 2011-08-09T11:22:03.180 に答える