2016-10-18 9 views
0

Я пытаюсь создать DropDownList для каждой записи в таблице в представлении. У меня возникли проблемы с установкой выбранного значения для раскрывающегося списка.Невозможно изменить выбранное значение для SelectList - MVC

В контроллере список пользователей каждого пользователя в модели заполняется вызовом метода в репозитории. Кажется, я не могу получить этот метод совершенно правильно. Я могу изменить выбранное значение для элемента, а accessLevels имеет правильное значение. Но в представлении это не выбранное значение. Как установить выбранное значение для выбранного списка?

Я попытался это:

Repository:

public IEnumerable<SelectListItem> GetSelectListAccessLevelsWithSelectedItem(string selectedAccessLevelID) 
     { 

      IEnumerable<SelectListItem> accessLevelsFromDB = DB.AccessLevels 
       .Select(x => new SelectListItem 
       { 
        Value = x.AccessLevelID.ToString(), 
        Text = x.Name 
       }); 


      SelectListItem item = null; 
      foreach (SelectListItem a in accessLevelsFromDB) 
      { 
       if (a.Value == selectedAccessLevelID) 
       { 

        item = a; 
        a.Selected = true; 
       } 
      } 

      var accessLevels = new SelectList(accessLevelsFromDB, item.Value); 
      return accessLevels; 
     } 

А также попытался возвращение accessLevelsFromDB:

return accessLevelsFromDB; 

Вид:

@Html.DropDownList("Accesslevels", user.AccessLevelsWithSelectedItem, new { @class = "form-control", @name = "accessLevels"}) 

ли я использовал, SelectList Constr uctor (IEnumerable, Object), правильно? Или что еще мне не хватает? Я пытался google, но до сих пор не понимаю, что я делаю неправильно. Я посмотрел на этот вопрос SelectList Selected Value Issue - Stack Overflow, но это не работает.

Update:

это модель:

public class EditCustomerViewModel 
{ 
    public Customer Customer { get; set; } 
    public int CustomerID { get; set; } 
    public List<User> Users { get; set; } 
    public List<UserToView> UsersToView { get; set; } 
    public IEnumerable<SelectListItem> AccessLevelListForSelectedUser { get; set; } 

} 

Update 2:

Я получил это работает сейчас и обновили свою модель и репозиторий.

Модель:

public class EditCustomerViewModel 
    { 
     public Customer Customer { get; set; } 
     public int CustomerID { get; set; } 
     public List<UserToView> UsersToView { get; set; } 

    } 

Repository:

public IEnumerable<SelectListItem> GetSelectListAccessLevelsWithSelectedItem(string selectedAccessLevelID) 
{ 
    IEnumerable<SelectListItem> accessLevelsFromDB = DB.AccessLevels 
     .Select(x => new SelectListItem 
     { 
      Value = x.AccessLevelID.ToString(), 
      Text = x.Name, 
      Selected = x.AccessLevelID.ToString() == selectedAccessLevelID 

     }); 
    return accessLevelsFromDB; 
} 
+0

Ваше мнение модель не имеет свойство с именем 'Accesslevels' так что вы даже не имеют обязательной силы ни к чему. И вы не устанавливаете свойство 'Selected'' SelectListItem' при привязке к свойству (его значение свойства, которое определяет, что выбрано (внутри метода создается собственный SelectList). И 'var accessLevels = new SelectList (accessLevelsFromDB , item.Value); 'не имеет смысла, потому что' accessLevelsFromDB' уже является 'SelectList' –

+0

. Модели просмотра никогда не должны содержать модели данных при редактировании. –

+0

AccessLevelsWithSelectedItem является свойством каждого пользователя в проете UserToView в модели, и это свойство, к которому я пытаюсь привязаться. Должен ли я помещать «AccessLevelsWithSelectedItem» в качестве первого аргумента строки в раскрывающемся списке или я пропустил его? – user3215947

ответ

0

Это должно дать вам выбранный элемент для вашего выпадающего списка:

public IEnumerable<SelectListItem> AccessLevelsWithSelectedItem(string selectedAccessLevelID) 
    { 
     return DB.AccessLevels 
      .Select(x => new SelectListItem 
      { 
       Value = x.AccessLevelID.ToString(), 
       Text = x.Name, 
       Selected = x.AccessLevelID.ToString() == selectedAccessLevelID 
      }); 
    } 
+1

Спасибо, что сработали отлично! – user3215947

-1

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

@Html.DropDownList("Accesslevels", user.AccessLevelsWithSelectedItem, new { @class = "form-control", @name = "accessLevels", Value = "something" }) 

или

@Html.DropDownList("Accesslevels", user.AccessLevelsWithSelectedItem, new { @class = "form-control", @name = "accessLevels", Value = Model.MyProperty }) 
+1

Нельзя смешивать атрибут 'value'. В лучшем случае вы замаскируете более глубокую проблему. В худшем случае вы будете мешать правильному привязке значений. –

+0

Я пробовал, но он по-прежнему не менял выбранного значения для выпадающего списка – user3215947

0

Было бы полезно, если бы мы могли видеть модель, которую использует ваш вид. Независимо от того, вы делаете это слишком сложно.

Во-первых, DropDownList требуется только IEnumerable<SelectListItem>. Razor позаботится о создании экземпляра SelectList и привязки соответствующего выбранного значения. Фактически, это так или иначе, поэтому ваши собственные попытки выбора элемента будут бесплодными, пока вы не найдете, что вызывает неправильное или нецелевое значение.

В этой связи, все вращается вокруг ModelState, которая состоит из значений из Request, ViewBag/ViewData и наконецModel.Эта «окончательная» часть важна, потому что что-либо в данных запроса или представления будет всегда переопределяет все, что установлено на вашей модели.

Другими словами, если ваше действие имеет такой параметр, как accessLevels, или вы что-то настраиваете, например, ViewBag.AccessLevels. Эти значения будут использоваться как «выбранное» значение для раскрывающегося списка.

Опять же, просмотр модели будет полезен здесь, но, вообще говоря, вы должны использовать семейство помощников *For в сочетании с моделью просмотра. В идеале, вы должны иметь свойство на вашей модели, как AccessLevels, а затем сделать что-то вроде:

@Html.DropDownListFor(m => m.AccessLevels, Model.AccessLevelOptions) 

Где AccessLevelOptions бы IEnumerable<SelectListItem> и содержать доступные уровни доступа. При этом у вас никогда не будет проблем с выбранным значением, потому что Razor будет обрабатывать все, и вы сильно привязаны к определенному свойству на своей модели. Только когда вы начинаете играть со строковыми именами, без каких-либо реальных привязок к чему-либо, что начнет идти наперекосяк.

+0

Я обновил модель. Но если я использую это @ Html.DropDownListFor (m => m.AccessLevels, Model.AccessLevelOptions), как выпадающее меню «знаете», какое значение выбрать? Мне нужно выбрать определенное значение, которое находится в модели под Model.UsersToView.UserToView.AccessLevel. – user3215947

+0

Это то, к чему вы должны быть привязаны. Он «знает» на основе того, что находится в «ModelState», поэтому вам нужно составить свою модель таким образом, чтобы свойство, которое вы связываете, хранило значение, которое оно имеет или должно иметь. –