1

Я хочу связать @Html.DropDownListFor от Model данных без использования Viewbag и посмотреть на множество разных примеров в Интернете. Но большинство из них используют Viewbag или метод расширения, и я хочу лучше подойти к решению этой проблемы. Я попытался следующие методы, но это не похоже на работу:Каковы наилучшие способы связывания @ Html.DropDownListFor в ASP.NET MVC5?

@Html.DropDownListFor(m => m.LabId, new SelectList(Model.Lab, "Id", "Name"), 
    "---- Select----", new { @class = "selectpicker" }) 

Можно ли связать @Html.DropDownListFor непосредственно из модели без использования Viewbag или каких-либо дополнительных метода в Controller в ASP.NET MVC5? Не могли бы вы привести несколько примеров для этого?

+0

'ViewBag' - это просто контейнер - передайте любые данные, которые вам нужны, как строго типизированная' @ model' – Jasen

ответ

2

Сильно типизированный модельный подход, который не использует динамический материал как ViewBag

Вы можете добавить новое свойство к вашей модели представления для Выбора параметров типа IEnumrable<SelectListItem>.

модель просмотра - это простой класс POCO, используемый для передачи данных между видом на метод действия и наоборот. Они характерны для взглядов. Добавить свойства, необходимые только для просмотра.

public class CreateUserVm 
{ 
    public IEnumrable<SelectListItem> Labs { set;get;} 
    public int SelectedLabId { set;get;} 
    //Add other properties as needed for the view 
} 

и в вашем GET действия, создать объект этой точки зрения модели, загрузите свойство Labs и отправить его к просмотру.

public ActionResult Create() 
{ 
    var vm= new CreateUserVm(); 
    // Hard coded for demo. You can replace with real data from db 
    vm.Labs = new List<SelectListItem> { 
    new SelectListItem { Value="1", Text="One" }, 
    new SelectListItem { Value ="2", Text="Two" } 
    }; 
    return View(vm); 
} 

и в представлении, которое сильно типизированных к этой точке зрения модели, вызовите вспомогательный метод DropDownListFor

@model CreateUserVm 
@Html.DropDownListFor(f=>f.SelectedLabId, Model.Labs,"Select one") 

Предварительно выбрав опцию в выпадающем списке

Если вам нравится предварительно выберите один вариант, когда бритва отобразит страницу. Вы можете установить значение свойства SelectedLabId вашей модели просмотра в значение свойства value объекта Option (SelectListItem).

public ActionResult Create() 
{ 
    var vm= new CreateUserVm(); 
    // Hard coded for demo. You can replace with real data from db 
    vm.Labs = new List<SelectListItem> { 
    new SelectListItem { Value="1", Text="SugarLab" }, 
    new SelectListItem { Value ="2", Text="CandyLab" }, 
    new SelectListItem { Value ="3", Text="SodaLab" } 
    }; 
    vm.SelectedLabId = 2; // Will set "CandyLab" option as selected 
    return View(vm); 
} 

Если вы хотите использовать реальные данные, вместо жесткого закодированных 2 пунктов, вы можете сделать это

vm.Labs = dbContext.Labs.Select(x=>new SelectListItem { Value=x.Id.ToString(), 
                 Text= x.Name }).ToList(); 

Предполагая dbContext ваш DbContext объект класса и имеет Labs свойство типа DbSet<Lab> где каждый объект Lab имеет свойство Id и Name.

+0

Большое спасибо за подробные объяснения и ответы. Я думаю, что это самый чистый способ для заполнения Dropdownlist. –

+0

Существует тонкое различие между значением по умолчанию и выбранным значением, когда дело доходит до DropDownListFor, и я бы сказал, что ваш метод предварительного выбора значения не совсем правильный - вам лучше использовать один из параметров DropDownListFor для этого, а не устанавливать его на модели. Я написал короткую статью только по этой проблеме - http://nimblegecko.com/how-to-set-default-selected-value-on-drop-down-list-from-database/ – Art

0

Вы находитесь на хорошем пути, имея элементы списка в своей модели. Я не знаю, как вы реализовали это в своем коде.

Свойство Lab в вашем классе модели должно быть IEnumerable, List или Collection того, что вы хотите. а затем в вашем бритвенном взгляде выглядит отлично.

Возможно, вы забыли, чтобы инициализировать список из метода действий в контроллере, прежде чем отправлять его в представление. E.г:

var model = new ViewModel{ 

Labs = repository.GetLabs(); 
} 

Выше я предполагаю, что хранилище должно быть то, что имеет доступ или средства получения необходимых данных, а также о том, что свойство Labs определяется как IEnumerable<Lab> Labs в классе ViewModel.

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