2017-02-07 6 views
0

Я пытался позволить моему Html.DropDownList сохранить определенное значение, которое выбрал пользователь.Бесполезно при попытке сохранить значение с помощью выбранного значения в SelectList в MVC

Код должен был использовать выбранное значение в SelectList для сохранения значения, чтобы выпадающий список сохранял значение, которое пользователь выбрал ранее. Страница была построена под MVC. Попытавшись какое-то время, я обнаружил, что веб-страница может вернуться только к своему первоначальному состоянию (прежде чем пользователь что-либо выберет), но не смог сохранить значение выпадающего списка после нажатия кнопки отправки.

Я также использовал jQuery для управления отображением и скрытием нескольких dropdownlists, для которых мне нужен только раскрывающийся список группы, и показывать другое, когда выбрано значение (розничная торговля, автобус, велосипед, дорожка и т. Д.) Являются значения выпадающего списка группы и имя дополнительных dropdownlists).

Ниже мой мой код: Контроллер:

public List<SelectListItem> SetGroup(string group) 
     { 
      List<SelectListItem> groups = new List<SelectListItem>(); 
      groups.AddRange(new SelectList(GMManager.FindAllGroup(), "MerchantNo", "MerchantName", group)); 
      groups.Add(new SelectListItem() { Text = "ALL", Value = "ALL", Selected = false }); 
      return groups; 

     } 

     public List<SelectListItem> SetRetail(string retail) 
     { 
      List<SelectListItem> retails = new List<SelectListItem>(); 
      retails.AddRange(new SelectList(GMManager.FindAllRetail(), "MerchantNo", "MerchantName",retail)); 
      retails.Add(new SelectListItem() { Text = "ALL", Value = "ALL", Selected = false }); 
      return retails; 

     } 

     public List<SelectListItem> SetBus(string bus) 
     { 
      List<SelectListItem> buses = new List<SelectListItem>(); 
      buses.AddRange(new SelectList(GMManager.FindAllBus(), "MerchantNo", "MerchantName",bus)); 
      buses.Add(new SelectListItem() { Text = "ALL", Value = "ALL", Selected = false }); 
      return buses; 

     } 

     public List<SelectListItem> SetBike(string bike) 
     { 
      List<SelectListItem> bikes = new List<SelectListItem>(); 
      bikes.AddRange(new SelectList(GMManager.FindAllBike(), "MerchantNo", "MerchantName",bike)); 
      bikes.Add(new SelectListItem() { Text = "ALL", Value = "ALL", Selected = false }); 
      return bikes; 

     } 

     public List<SelectListItem> SetTrack(string track) 
     { 
      List<SelectListItem> tracks = new List<SelectListItem>(); 
      tracks.AddRange(new SelectList(GMManager.FindAllTrack(), "MerchantNo", "MerchantName",track)); 
      tracks.Add(new SelectListItem() { Text = "ALL", Value = "ALL", Selected = false }); 
      return tracks; 

     } 

     public List<SelectListItem> SetParking(string parking) 
     { 
      List<SelectListItem> parkings = new List<SelectListItem>(); 
      parkings.AddRange(new SelectList(GMManager.FindAllParking(), "MerchantNo", "MerchantName",parking)); 
      parkings.Add(new SelectListItem() { Text = "ALL", Value = "ALL", Selected = false }); 
      return parkings; 

     } 

     public List<SelectListItem> SetOutsourcing(string outsourcing) 
     { 
      List<SelectListItem> outsourcings = new List<SelectListItem>(); 
      outsourcings.AddRange(new SelectList(GMManager.FindAllOutsourcing(), "MerchantNo", "MerchantName",outsourcing)); 
      outsourcings.Add(new SelectListItem() { Text = "ALL", Value = "ALL", Selected = false }); 
      return outsourcings; 

     } 


public ActionResult RPT_160501() 
     { 
      string start = DateTime.Now.ToString("yyyyMMdd"); 
      string end = DateTime.Now.ToString("yyyyMMdd"); 
      string group = ""; 
      string retail = ""; 
      string bus = ""; 
      string bike = ""; 
      string track = ""; 
      string parking = ""; 
      string outsourcing = ""; 

      DataTable dt = null; 



       if (Request.Form["searchConfirm"] != null || Request.Form["ExportExcel"] != null) 
       { 
        start = Request.Form["startDate"]; 
        end = Request.Form["endDate"]; 

        group = Request.Form["group"]; 
        retail = Request.Form["retail"]; 
        bus = Request.Form["bus"]; 
        bike = Request.Form["bike"]; 
        track = Request.Form["track"]; 
        parking = Request.Form["parking"]; 
        outsourcing = Request.Form["outsourcing"]; 
       } 

       ViewBag.Group = SetGroup(group); 
       ViewBag.Retail = SetRetail(retail); 
       ViewBag.Bus = SetBus(bus); 
       ViewBag.Bike = SetBike(bike); 
       ViewBag.Track = SetTrack(track); 
       ViewBag.Parking = SetParking(parking); 
       ViewBag.Outsourcing = SetOutsourcing(outsourcing); 

       ViewBag.RepName = "ReportName"; 
       ViewBag.Start = start; 
       ViewBag.End = end; 

Вид:

<script> 
    $(document).ready(function() { 
     $("#retail").hide(); 
     $("#bus").hide(); 
     $("#bike").hide(); 
     $("#track").hide(); 
     $("#parking").hide(); 
     $("#outsourcing").hide(); 
     $("#group").on("change", function() { 
      switch ($(this).val()) { 
       case "RETAIL": 
        $("#retail").show(); 
        $("#bus").hide(); 
        $("#bike").hide(); 
        $("#track").hide(); 
        $("#parking").hide(); 
        $("#outsourcing").hide(); 
        break; 
       case "BUS": 
        $("#retail").hide(); 
        $("#bus").show(); 
        $("#bike").hide(); 
        $("#track").hide(); 
        $("#parking").hide(); 
        $("#outsourcing").hide(); 
        break; 
       case "BIKE": 
        $("#retail").hide(); 
        $("#bus").hide(); 
        $("#bike").show(); 
        $("#track").hide(); 
        $("#parking").hide(); 
        $("#outsourcing").hide(); 
        break; 
       case "TRACK": 
        $("#retail").hide(); 
        $("#bus").hide(); 
        $("#bike").hide(); 
        $("#track").show(); 
        $("#parking").hide(); 
        $("#outsourcing").hide(); 
        break; 
       case "PARKING_LOT": 
        $("#retail").hide(); 
        $("#bus").hide(); 
        $("#bike").hide(); 
        $("#track").hide(); 
        $("#parking").show(); 
        $("#outsourcing").hide(); 
        break; 
       case "BANK_OUTSOURCING": 
        $("#retail").hide(); 
        $("#bus").hide(); 
        $("#bike").hide(); 
        $("#track").hide(); 
        $("#parking").hide(); 
        $("#outsourcing").show(); 
        break; 
       default: 
        $("#retail").hide(); 
        $("#bus").hide(); 
        $("#bike").hide(); 
        $("#track").hide(); 
        $("#parking").hide(); 
        $("#outsourcing").hide(); 
        break; 
      } 
     }) 
    }) 

</script> 


<meta name="viewport" content="width=device-width" /> 
<title>@ViewBag.RepName</title> 

<h2>@ViewBag.RepName</h2> 



@using (Html.BeginForm("RPT_160501", "ReportSystem", FormMethod.Post, new { id = "searchForm" })) 
{ 
    <div> 
     <label for="startDate"> Date:</label> 
     <input type="text" name="StartDate" id="StartDate" value="@ViewBag.Start" style="width:100px;" /> ~ 
     <input type="text" name="EndDate" id="EndDate" value="@ViewBag.End" style="width:100px;" /> 


     @Html.DropDownList("group", (IEnumerable<SelectListItem>)ViewBag.Group, "--Please Choose--") 
     @Html.DropDownList("retail", (IEnumerable<SelectListItem>)ViewBag.Retail, "--Please Choose--") 
     @Html.DropDownList("bus", (IEnumerable<SelectListItem>)ViewBag.Bus, "--Please Choose--") 
     @Html.DropDownList("bike", (IEnumerable<SelectListItem>)ViewBag.Bike, "--Please Choose--") 
     @Html.DropDownList("track", (IEnumerable<SelectListItem>)ViewBag.Track, "--Please Choose--") 
     @Html.DropDownList("parking", (IEnumerable<SelectListItem>)ViewBag.Parking, "--Please Choose--") 
     @Html.DropDownList("outsourcing", (IEnumerable<SelectListItem>)ViewBag.Outsourcing, "--Plase Choose--") 

     <input type="submit" name="searchConfirm" value="Search" class="btn btn-default" /> 
     <input type="submit" name="ExportExcel" value="Export Excel" class="btn btn-default" /> 
    </div> 
} 
<table class="grid" width="100%"> 
    <thead> 
     <tr style="background-color: lightgray"> 
      <th> 
       A 
      </th> 
      <th> 
       B 
      </th> 
      <th> 
       C 
      </th> 
      <th> 
       D 
      </th> 


     </tr> 
    </thead> 
    <tbody> 
+0

Вы не правильно привязываетесь ни к чему. Используйте модель представления и привяжите ее к ней. Обратитесь к коду в [этот вопрос/ответ] (http://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key-xxx-is-of-type-system-int32-but -must-be-o) для создания модели и привязки к ней –

ответ

0

Вы не используете MVC, как она предназначена. Метод Action RPT_160501 должен иметь сильный типизированный объект ViewModel в качестве параметра, позволяющий MVC анализировать и связывать опубликованные значения формы, а не делать все это самостоятельно.
То же самое относится к представлению, которое также не имеет объявления @model, поскольку ViewBag используется для всего.

Хотя это разбор и связывание, MVC будет также заполнить глобальный ModelState объект, который - среди многих вещей - также используется внутри MVC, чтобы сделать отправленный или пытавшееся значение, до тех пор, пока вы используете Html.DropDownListFor(m => m.group, ....) < - это это мой ответ на ваш вопрос, но он работает, только если вы примете этот подход в целом.

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

См., Например, этот вопрос для получения дополнительной информации об этом: MVC ViewModel example