Выпадающие списки MVC 5

#asp.net #razor #asp.net-mvc-5

#asp.net #razor #asp.net-mvc-5

Вопрос:

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

Мой intellisense сломан в VS2015, поэтому я немного спотыкаюсь в темноте.

Итак, я заполнил пару выпадающих списков, месяц и год. Не самый красивый, но работает:

 @Html.DropDownList("Month", new List<SelectListItem>
           {
                new SelectListItem { Text = "January", Value = "1"},
                new SelectListItem { Text = "February", Value = "2"},
                new SelectListItem { Text = "March", Value = "3"},
                new SelectListItem { Text = "April", Value = "4"},
                new SelectListItem { Text = "May", Value = "5"},
                new SelectListItem { Text = "June", Value = "6"},
                new SelectListItem { Text = "July", Value = "7"},
                new SelectListItem { Text = "August", Value = "8"},
                new SelectListItem { Text = "September", Value = "9"},
                new SelectListItem { Text = "October", Value = "10"},
                new SelectListItem { Text = "November", Value = "11"},
                new SelectListItem { Text = "December", Value = "12"}
           }, "Month")
           @Html.DropDownList("Year", new List<SelectListItem>
            {
                new SelectListItem { Text = Convert.ToString(DateTime.Now.Year - 1), Value = Convert.ToString(DateTime.Now.Year - 1)},
                new SelectListItem { Text = Convert.ToString(DateTime.Now.Year), Value = Convert.ToString(DateTime.Now.Year), Selected = true},
                new SelectListItem { Text = Convert.ToString(DateTime.Now.Year   1), Value = Convert.ToString(DateTime.Now.Year   1)},
            }, "Year")
  

Теперь, когда один из выпадающих списков изменен, я хотел бы отправить выпадающий выбор из обоих элементов управления на мой контроллер для этого представления с содержимым списка DD. Оттуда я могу перезагрузить страницу. Документация MSDN неясна, поскольку единственный конструктор для DropDownList не имеет параметров, поэтому мне неясно, куда должны идти материалы, управляемые событиями.

Комментарии:

1. Неясно, о чем вы спрашиваете — если они находятся в форме, выбранные значения будут отправлены на ваш контроллер, но что вы имеете в виду с содержимым списка DD ? (и нет, это не самое красивое — это ужасно). И на какой материал, управляемый событиями , вы ссылаетесь?

2. «и нет, это не самое красивое — это ужасно» — Спасибо, что втираете это. Я хорошо осознаю, насколько это некрасиво на данный момент.

Ответ №1:

Один из способов справиться с этим случаем использования — сохранить выбранные элементы внутри form и отправить их, когда произойдет событие изменения выбранных элементов.

 @using (Html.BeginForm("Index","Home",FormMethod.Get))
{
  <!-- your existing code for SELECT elements goes here-->
}
  

Теперь вы можете прослушать change событие для ВЫБРАННЫХ элементов и отправить ближайшую форму.

 $(function () {

    $("#Year,#Month").change(function() {
        $(this).closest("form").submit();
     });

});
  

Предполагая, что Index метод action принимает год и месяц в качестве параметров

 public ActionResult Index(int? year,int? month)
{
  // Check the year and month values, if not null, use them to filter your data
  // to do  : Return something
}
  

Ответ №2:

оберните элементы тегом формы (post action).

на стороне сервера создайте модель, которая имеет параметры месяца и года, такие как:

 public class MyModel{
    public string Month {get;set;}
    public string Year {get;set;}
}
  

и ваш html должен быть чем-то вроде:

    @using (Html.BeginForm("Index", "Home", FormMethod.POST, new { id = "MyForm" })) 
    {
       @Html.DropDownList("Month", *your data*, "select month",   new{ onchange = "document.getElementById('MyForm').submit();" })

       @Html.DropDownList("Year", *your data*, "select year",   new{ onchange = "document.getElementById('MyForm').submit();" })

       <input type='submit' value='make the magic' />
    } 
  

эта строка привязывает событие изменения вашего выпадающего списка, находит вашу форму по идентификатору и отправляет ее.

new{ onchange = «document.getElementById(‘MyForm’).submit();»

Комментарии:

1. У Severside уже есть datamodel, как мне обработать добавление еще одной в представление?

2. с помощью js вы можете отправить любую форму или несколько форм… и вы можете поместить любой ввод в другую форму с уникальным идентификатором и отправить его при изменении любого ввода…