Как получить выбранный год и месяц из раскрывающегося списка в контроллер в asp.net MVC

Как получить выбранный год и месяц из раскрывающегося списка из представления в контроллер. Когда я попытался выдать ошибку, поскольку нет элемента ViewData типа «IEnumerable» с ключом «Yearitems». Поскольку я новичок в Asp.net mvc, любая помощь будет оценена. Заранее спасибо.

Это мой взгляд

<h3>Search by PhoneNumber:@Html.TextBox("SearchString",ViewBag.CurrentFilter as string)  </h3>


    <p><h3>Year:@Html.DropDownList("Yearitems",    (IEnumerable<SelectListItem>)ViewBag.SelectList as SelectList, "Select Year")</h3>

    <h3>Month:@Html.DropDownList("MonthItems",(IEnumerable<SelectListItem>)ViewBag.SelectMonthList as SelectList,"Select Month")</h3></p>

<p><input type="submit" value="Search" /></p>

<script>
    $(document).ready(function () {
        $("#Yearitems").change(function () {

            //alert($("#Yearitems>option:selected").attr("Value"));
            $.ajax({
                type: "Post",
                url: '@Url.Action("GetMonths","AirtelManagement")',
                data: { YearId: $("#Yearitems>option:selected").attr("Value") },
                datatype: "Json",
                success: function (data) {

                    $("#MonthItems").html("");
                    $.each(data, function (index, item) {
                        $("#MonthItems").append(new Option(item.MonthName, item.MonthSelectedId));
                    });
                },
                error: function () {
                    alert("Select Year");
                }
            });
        });
    });
</script>

}

Это Мой контроллер.

     public ActionResult ViewDataOfDatabase(string sortorder, string currentFilter,  string searchString, int? page,string SelecetedYear,string SelectedMonth)
     {

         AirtelManagementModel _Airtelmodel = new AirtelManagementModel();
         IEnumerable<clsYearOfDate> SelectList = GetYears();
         //IEnumerable<MonthListClass> SelectMonthList = GetMonths(YearId);
         IEnumerable<SelectListItem> Yearitems = (from v in SelectList
                                             select new SelectListItem()
                                             {
                                                 Value = v.YearSelectedId.ToString(),
                                                 Text = v.YearOfDate.ToString(),


                                             });
         ViewBag.SelectList = Yearitems;

         //IEnumerable<SelectListItem> MonthItems = (from m in SelectMonthList
         //                                          select new SelectListItem()
         //                                          {
         //                                              Value = m.MonthSelectedId.ToString(),
         //                                              Text = m.MonthName,


         //                                          });
         //ViewBag.SelectMonthList = MonthItems;
         IEnumerable<SelectListItem> MonthItems = Enumerable.Empty<SelectListItem>();
         ViewBag.SelectMonthList = MonthItems;
        List<AirtelManagementModel> list = ViewDetails();
        ViewBag.CurrentSort = sortorder;

        ViewBag.PhoneSortParm = String.IsNullOrEmpty(sortorder) ? "Phone_desc" : "";
        if (searchString != null )
        {
            page = 1;
        }
        else
        {

            searchString = currentFilter;
        }
        //if(searchString!=null)
        //{
        ViewBag.SelectList = SelecetedYear;
        ViewBag.SelectMonthList = SelectedMonth;
            ViewBag.CurrentFilter = searchString;
            var airteldetails = from _model in list
                                select _model;
            if(!String.IsNullOrEmpty(searchString))
            {
                airteldetails=airteldetails.Where(A=>A.AirtelNumber.ToString().Contains(searchString.ToString()));

            }

            //airteldetails=airteldetails.OrderByDescending(A=>A.AirtelNumber);
            int pageSize = 5;
            int pageNumber = (page ?? 1); 
            //return View(airteldetails.ToList());
            return View(airteldetails.ToPagedList(pageNumber, pageSize));
        //}
        //if (list.Count > 0)
        //{
        //    var airteldetails = from _model in list
        //                        select _model;
        //    return View(airteldetails.ToPagedList(pageNumber,pageSize));
        //}
        //else
        //{
        //    ModelState.AddModelError("Error", "No Data found in Database");
        //    return RedirectToAction("ImportExcelFile", "AirtelManagement");
        //}
    }

person user3273883    schedule 09.05.2014    source источник
comment
вы можете опубликовать свой метод действия контроллера?   -  person Neel    schedule 09.05.2014
comment
Проверь .. Добавил сейчас.   -  person user3273883    schedule 09.05.2014
comment
Но переменные Yearitems и MonthItems уже присутствуют в действии контроллера @Gary Schreiner   -  person user3273883    schedule 09.05.2014
comment
Действие контроллера имеет SelectedMonth и SelectedYear в качестве входных параметров, а не YearItems и MonthItems, как определено в атрибуте имени DropDownList (SELECT).   -  person Gary Schreiner    schedule 09.05.2014


Ответы (2)


Имя вашего Select / DDL должно быть таким же, как параметр в вашем методе действия контроллера, то есть public ActionResult ViewDataOfDatabase(...,String YearItems, String MonthItems)или измените имя в вашем @Html.DropDownList("name"... на SelectedMonth и SelectedYear, чтобы оно соответствовало DDL

person Gary Schreiner    schedule 09.05.2014

Прочтите данные из FormCollection:

public ActionResult ViewDataOfDatabase(FormCollection form)
{

    string Month = form["MonthItems"].ToString();
 .............................
..............................

}
person Ehsan Sajjad    schedule 09.05.2014
comment
Хотя это возможно, я считаю, что это открывает вас для тех, кто редактирует html и отправляет форму, вынуждая вас добавить дополнительную проверку на null и проверку параметров в коде. Если вы явно определите строго типизированные входные параметры, тогда все действие выдаст ошибку и выдаст 500, прежде чем даже перейти к коду. Просто делает его немного чище, добавляет проверку в начале, и ИМХО более безопасен. - person Gary Schreiner; 09.05.2014
comment
да @GarySchreiner самый первый предпочтительный вариант - это строгое представление типа с объектом Model, но в сценарии Op так, как Op делает это намного лучше, используя FormCollection - person Ehsan Sajjad; 09.05.2014