mvc управляет двумя выпадающими списками для фильтрации данных

Привет всем, я хочу задать вопрос о выпадающем списке MVC. Я пытаюсь отфильтровать данные по их местам или их кодам, пока выпадающий список не изменился. Я могу сделать это, когда использую один выпадающий список, но когда я использую более одного выпадающего списка, я не могу получить результаты отдельно.

Как вы видите на картинке у меня есть два выпадающих списка.

MVC два выпадающего списка выбранного индекса

public ActionResult Index(int? id,int? ddwList)
    {

        Repository<Order> _ro = new Repository<Order>();
        IEnumerable<SelectListItem> _orderSelectListItem = _ro.All().AsEnumerable().Select(s => new SelectListItem
        {
            Text = s.code,
            Value = s.id.ToString()
        });

        ViewData["ddOrder"] = _orderSelectListItem;

        Repository<Workshop> _rw = new Repository<Workshop>();
        IEnumerable<SelectListItem> _workshopSelectListItem = _rw.All().AsEnumerable().Select(s => new SelectListItem
        {
            Text = s.name,
            Value = s.id.ToString()
        });

        ViewData["ddwList"] = _workshopSelectListItem;

        Repository<ClothShipment> _rcs = new Repository<ClothShipment>();
        IEnumerable<MyClothShipment> _myClothShipment = null;

        if (id != null)
        {
            int? idOrd = _rcs.Find(w => w.orderId == id).orderId;
            //int? idWork = _rcs.Find(w => w.workshopId == id).workshopId;

            if (idOrd != null)
            {
                _myClothShipment = _rcs.All().Where(w => w.orderId == id).Select(s => new MyClothShipment
               {
                   id = s.id,
                   amount = s.amount,
                   orderName = s.order.code,
                   clothName = s.clothList.name,
                   workshopName = s.workshop.name,
                   shipDate = s.shipDate
               });
            }
            //else if(idWork != null){
            //    _myClothShipment = _rcs.All().Where(w => w.workshopId == id).Select(s => new MyClothShipment
            //    {
            //        id = s.id,
            //        amount = s.amount,
            //        orderName = s.order.code,
            //        clothName = s.clothList.name,
            //        workshopName = s.workshop.name,
            //        shipDate = s.shipDate
            //    });
            //}
        }
        else {
            _myClothShipment = _rcs.All().Select(s => new MyClothShipment
            {
                id = s.id,
                amount = s.amount,
                orderName = s.order.code,
                clothName = s.clothList.name,
                workshopName = s.workshop.name,
                shipDate = s.shipDate
            });
        }

        return View(_myClothShipment);
    }

мой взгляд здесь

 <div id="sample_editable_2_length" class="dataTables_length">
                        <label>
                            @Html.DropDownList("ddwList",(IEnumerable<SelectListItem>)ViewData["ddwList"],"Atölye Seçiniz",new {@id="StateDropDown1", @class = "span15 chosen"})
                        </label>
                    </div>

мой взгляд здесь

<div id="sample_editable_2_length" class="dataTables_length">
                        <label>
                            @Html.DropDownList("ddwList",(IEnumerable<SelectListItem>)ViewData["ddwList"],"Atölye Seçiniz",new {@id="StateDropDown1", @class = "span15 chosen"})
                        </label>
                    </div>

<div id="sample_editable_1_length" class="dataTables_length">
                        <label>
                            @*<select class="m-wrap small" name="sample_editable_1_length" size="1" aria-controls="sample_editable_1">

                            </select>*@
                            @Html.DropDownList("ddOrder",(IEnumerable<SelectListItem>)ViewData["ddOrder"],"Sipariş Kodu Seçiniz",new {@id="StateDropDown", @class = "span15 chosen"})
                        </label>
                    </div>

и вот мой код скрипта

$("#StateDropDown").change(function (e) {

            var controllerName = '@ViewContext.RouteData.Values["Controller"].ToString()';
            var actionName = '@ViewContext.RouteData.Values["Action"].ToString()';

            var _id = $("#StateDropDown").val();
            var _url = "/" + controllerName + "/" + actionName + "/" + _id;


            window.location.href =_url 

        });

        $("#StateDropDown1").change(function (e) {

            var controllerName = '@ViewContext.RouteData.Values["Controller"].ToString()';
            var actionName = '@ViewContext.RouteData.Values["Action"].ToString()';

            var _id = $("#StateDropDown1").val();
            var _url = "/" + controllerName + "/" + actionName + "/" + _id;


            window.location.href = _url

        });

Я заполняю выпадающие списки при загрузке страницы из базы данных и получаю все данные для показа с раскрывающимися списками. Я хочу отфильтровать показанные данные... И с помощью этого кода один из моих раскрывающихся списков работает, я беру идентификатор выбранного элемента (индекс (int? id)) здесь, но когда я пытаюсь использовать оба из них по отдельности, это не работает, как я могу заставить их обоих работать. Что я должен делать? Второй параметр всегда имеет значение null или, если я использую другой параметр, кроме "id", он снова принимает значение null а также я попытался принять параметр в качестве строки, но он также стал нулевым... Спасибо за вашу помощь.

2 ответа

Чтобы объяснить, что делает ваш код:

Когда вы выбираете значение из вашего первого выбора, вы передаете его значение методу Index (например, /Index/1) так что значение параметра id равен 1, но значение не передано параметру ddwList так что это ноль. Когда вы выбираете значение из второго выбора, вы передаете его значение в метод индекса (ред. /Index/5) так что значение параметра id 5, но значение не передано параметру ddwList так что опять ноль.

Предполагая, что вы хотите отобразить таблицу, основанную на выборках обоих выборок, вам нужно построить URL как /Index?id=1&ddwList=5, Поэтому удалите события изменения из ваших выборов и добавьте кнопку, которая создает запрос в его событии щелчка. Однако то, как вы это делаете, каждый раз перезагружает всю страницу. Я предлагаю вам рассмотреть возможность загрузки таблицы из частичного просмотра с помощью jQuery.get() метод, чтобы избежать полной загрузки страницы каждый раз. Например

public ActionResult Index()
{
  // Build the 2 select lists only
  return View();
}

Индексный вид

// Add the two @Html.DropdownFor()...
<button id="LoadTable">Load Table</button>
<div id="TablePlaceholder"></div>

и сценарий

$('#LoadTable').click(function() {
  var id1 = // the value of the first select
  var id2 = // the value of your second select    
  $.get('@Url.Action("Table")', { id: id1, ddwList: id2 }, function(data) {
    $('#TablePlaceHolder').html(data);
  });
}

и частичный результат

public ActionResult Table(int? id, int? ddwList)
{
  // Build your table view based on values of id and ddwList
  return PartialView();
}

Если я понимаю, вы можете использовать один из раскрывающихся списков за раз, и этот раскрывающийся список успешно отправляет его значение вашему контроллеру, в то время как другой раскрывающийся список всегда отправляет ноль. Если это так, то это работает правильно с тем, как вы создали свои выпадающие списки с меткой опции.

Как объяснено в документации msdn: http://msdn.microsoft.com/en-us/library/dd492256(v=vs.118).aspx

optionLabel Тип: System.String Текст для пустого элемента по умолчанию. Этот параметр может быть нулевым.

Поэтому, если вы хотите, чтобы оба раскрывающихся списка использовались одновременно, вам нужно удалить события для.change и добавить форму с этими раскрывающимися списками И кнопку отправки внутри, чтобы использовать оба значения одновременно.

ИЛИ ЖЕ

Не используйте метку опции, означающую, что первая опция dropDownList будет использоваться в качестве начального значения / значения по умолчанию. Вот ссылка на документы MSDN, показывающие различные способы форматирования помощника Html.DropDownList: http://msdn.microsoft.com/en-us/library/system.web.mvc.html.selectextensions.dropdownlist(v=vs.118).aspx

Надеюсь я вас правильно понял!

Другие вопросы по тегам