2013-08-22 2 views
2

У меня есть action, который извлекает данные и отправляет их на view. В представлении у меня есть два раскрывающихся меню.Html.DropDownListFor не выбирает значение

Первый снимок показывает приветствие (например, «г-н», «г-жа» и т. Д.) И по какой-то причине не выбрал значение, которое я отправил. В другом выпадающем списке отображается список языков и правильно выбирается значение, которое я отправил на просмотр. Ниже представлен соответствующий код.

@Html.DropDownListFor(model => model.Salutation, ViewBag.salutation as IEnumerable<SelectListItem>)

@Html.DropDownListFor(model => model.Language, ViewBag.languages as IEnumerable<SelectListItem>)

В контроллере у меня есть следующий код, чтобы получить данные выпадающие.

ViewBag.salutation = new List<SelectListItem>() { 
             new SelectListItem() { Text = "", Value = "" }, 
             new SelectListItem() { Text = "Mr.", Value = "Mr." }, 
             new SelectListItem() { Text = "Ms.", Value = "Ms." }, 
             new SelectListItem() { Text = "Mrs.", Value = "Mrs." } 
            }; 

и

var languages = (from l in db.Languages.ToList() 
         select new SelectListItem() 
         { 
          Text = l.Language, 
          Value = l.LanguageId.ToString() 
         }).ToList(); 
     languages.Insert(0, new SelectListItem() { Text = "", Value = "" }); 
     ViewBag.languages = languages; 

Единственное различие, которое я мог думать о том, что языки выпадающий имеет целое число в качестве значения, в то время как приветствием выпадающий имеет текст в качестве значения. Поэтому почему всплывающее окно приветствия не работает? Я знаю, что могу пройти через каждое приветствие List<SelectListItem> и установить значение Selected на основе значения, полученного из базы данных. Но я надеялся, что будет более чистый способ сделать это.

Любые идеи?

Благодаря

UPDATE

я решил сделать то, что я сделал для другого проекта.

IList<SelectListItem> _salutation = new List<SelectListItem>() 
     { 
      new SelectListItem() { Value = "", Text = "" }, 
      new SelectListItem() { Value = "Mr.", Text = "Mr." }, 
      new SelectListItem() { Value = "Ms.", Text = "Ms." }, 
      new SelectListItem() { Value = "Mrs.", Text = "Mrs." } 
     }; 
     // I could put the following in the declaration above, but for testing purposes it's in foreach loop. 
     foreach (var item in _salutation) 
     { 
      // compare to what's retrieved from database 
      item.Selected = item.Value == _viewData.Salutation; 
     } 
     ViewBag.salutation = _salutation; 

После foreach петли Выхода I .Value, .Selected свойства каждого элемента в _salutation и я получаю все правильные значения с одним элемента выбран. Внутри представления я сделал следующее.

 @foreach (var item in ViewBag.salutation as IEnumerable<SelectListItem>) 
     { 
      <b>@item.Value : @item.Text : @item.Selected</b><br /> 
     } 

Весь правильный текст/значения появляются, но ни один из них не выбран! Это происходит, если я вывожу значения после выполнения @Html.DropDownListFor(). Если я вывожу ViewBag.salutation перед html-хелпером, выбирается правильное значение.

РЕШЕНИЕ

Я нашел следующую статью полезной: DropDownListFor with ASP.NET MVC.

Вместо использования ViewBag Я добавил в ViewModel следующее. (Показывая часть для приветствий выпадающие.)

public class TheViewModel 
{ 
    private IList<string> _salutations = new List<string>() { "", "Mr.", "Ms.", "Mrs." }; 

    public IEnumerable<SelectListItem> SalutationItems 
    { 
     get 
     { 
      var salutations = _salutations.Select(s => new SelectListItem { Value = s, Text= s }); 
      return salutations; 
     } 
    } 
    // The rest of the ViewModel 
} 

И в View я следующее.

@Html.DropDownListFor(model => model.Salutation, Model.SalutationItems) 
+0

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

+0

ViewBag содержит данные для выпадающего списка (что может быть много элементы, как это имеет место для языков), и в моей модели у меня есть одно значение для каждого раскрывающегося списка - они поступают из базы данных - и это то, что я хочу выбрать. Одно выпадающее меню работает, а другое нет. – erdinger

+0

что вы пытаетесь сделать, его непонятно для меня, почему вы используете как модель, так и сумку, почему бы и нет? –

ответ

4

Вместо того, чтобы просто поставлять список в DropDownListFor помощника вы могли бы предоставить ему SelectList. Конструктор SelectList берет список и позволяет явно указать выбранное значение, а также перегрузку, которая позволяет указать поля «Текст и значение».

@Html.DropDownListFor(model => model.Salutation, 
         new SelectList(ViewBag.salutation as IEnumerable<SelectListItem>, 
            "Value", "Text", Model.Salutation)) 
+0

Какая разница в 1-м и третьем параметрах? –

+0

Это заполняет выпадающий список '' System.Web.Mvc.SelectListItem '' для каждой записи. Но я думаю, что это очень близко. – erdinger

+0

Попробуйте использовать другую перегрузку, чтобы указать поля текста и значения в списке. – asymptoticFault

0

Попробуйте это,

@Html.DropDownListFor(m =>m.DDCountryModel,IEnumerable<SelectListItem>)ViewBag.salutation) 

@Html.DropDownListFor(model => model.Language, IEnumerable<SelectListItem>)ViewBag.languages) 

Ваша модель должна быть такой,

public class Model 
{ 
public IEnumerable<SelectListItem> DDCountryModel{ get; set; } 
public IEnumerable<SelectListItem> Language{ get; set; } 
}