2016-11-19 5 views
0

Я пытаюсь использовать SelectListItem для проекта MVC, drop down заполняется так, как я ожидаю. Но когда я передаю выбранное значение функции, которая принимает строку, используя этот model.CodeDropDown.ToString(), я получаю System.Collections.Generic.List 1[System.Web.Mvc.SelectListItem], который не является строкой.Получить выбранное значение из SelectItemList

Как получить выбранное значение в виде строки?

У меня есть ViewModel класс, который выглядит следующим образом:

public class HomeViewModel 
{ 
    [Required] 
    [DisplayName("Code")] 
    public IEnumerable<SelectListItem> CodeDropDown { get; set; } 
    public string SelectedValue { get; set; } 
} 

Я пополняя ниспадающее меню с помощью этого Controller

public ActionResult Index() 
{ 
    var model = new HomeViewModel(); 
    using (var dbCon = new SomeDBContext()) 
    { 
     model.CodeDropDown = dbCon.CodeID.ToList().Select(x => new SelectListItem 
     { 
      Value = x.Name.ToString(), Text = x.CodeDropDown.ToString() 
      }).DistinctBy(c => c.Value); 
     } 
     return View(model); 
    } 
} 

Я пытаюсь использовать значение из SelectListItem, как это ,

public ActionResult Index(HomeViewModel model) 
    { 
     var results = mainDbContext.GetSomeResult(model.CodeDropDown.ToString(), model.Prop2, model.Prop3);   
     return View(results); 
    } 

Вид выглядит следующим образом:

@Html.DropDownListFor(model => model.SelectedValue, Model.CodeDropDown, "--") 

ответ

1

Добавьте еще одно свойство (SelectedThingId или что-то более значимое) в HomeViewModel, чтобы удерживать значение выбранной вещи в раскрывающемся списке.

На ваш взгляд (вы не писал код для просмотра) есть что-то вроде этого:

@Html.DropDownListFor(x=>x.SelectedThingId, Model.CodeDropDown) 

Тогда в контроллере вы можете получить это значение с помощью:

model.SelectedThingId; // model is passed into your controller has you have it. 
+0

ли, что значение 'SelectedThingID' автоматически передается? – hello

+0

Да, эта строка позаботится об этом для вас: @ Html.DropDownListFor (x => x.SelectedThingId, Model.CodeDropDown). Это говорит движку просмотра MVC (Razor и т. Д.), Чтобы создать раскрывающийся список и заполнить его данными из Model.CodeDropDown и всякий раз, когда выбор сделан, записать его в SelectedThingId. Для этого Razor напишет все необходимые html и javascript. – CodingYoshi

+0

По-прежнему не получается желаемого результата. Посмотрите на обновление. – hello

1

Добавить 2 свойства в модель

public string CodedropdownID{ get; set; } //to store the selected dropdown value Id 
public string CodedropdownText{ get; set; } //to store the selected dropdown value text 

Изменить вид как показано ниже и добавить событие обмена в раскрывающееся меню:

@Html.DropDownListFor(m=> m.CodedropdownID, m.CodeDropDown, "--") 
@Html.Hiddenfor(m=>m.CodedropdownText) 

Добавьте следующий скрипт:

<script type="text/javascript"> 

$("#CodedropdownID").on("change", function { 
    $("#CodedropdownText").val($(this).text()); 
}); 

</script> 

Изменить метод контроллера

public ActionResult Index(HomeViewModel model) 
    { 
     var results = mainDbContext.GetSomeResult(model.CodedropdownText.ToString(), model.Prop2, model.Prop3);   
     return View(results); 
    } 
+0

Почему 'JS'? ...... – hello

+0

Используя JS, мы получаем текст выпадающего значения при изменении выпадающего меню, тогда мы сохраняем текст как скрытое значение. –

+0

Если вы собираетесь использовать только CodedropdownID, тогда вы просто получите ID выбранного выпадающего списка, а не строковое значение. –

Смежные вопросы