Подтвердить что ты не робот

Разница между DropDownlist или DropDownListFor Html helper

Кажется странным, что я не мог найти объяснения разницы между этими двумя помощниками, поэтому я бы предположил, что это что-то очевидное, но я пропустил.

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

public class Booking
    {
        public int ID { get; set; }
        public Room Room { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }
        public ICollection<Equipment> Equipments { get; set; }
        public string Who { get; set; }
    }

и я хочу отобразить простой список DropDownlist для добавления и редактирования записи бронирования.

После большого количества Google вокруг мне кажется, что мне, вероятно, нужен DropDopwListFor, но не уверен, почему и как?

4b9b3361

Ответ 1

Возьмем следующие два примера:

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text")
)

и

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text")
)

Очевидно, что во втором примере имя свойства, к которому вы привязываете выпадающее меню, жестко закодировано как магическая строка. Это означает, что если вы решите реорганизовать свою модель и переименуете это свойство, то поддержка Tooling, которую вы можете использовать, не имеет способа обнаружить это изменение и автоматически модифицировать магическую строку, которую вы жестко закодировали во потенциально много просмотров. Таким образом, вам придется вручную искать и заменять везде, где используется этот слабоспециализированный помощник.

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

Сильно типизированные помощники были впервые представлены в ASP.NET MVC 2, и последний раз, когда я использовал слабо типизированный помощник, в ASP.NET MVC 1 приложение давно.

Ответ 2

DropDownListFor автоматически выберет выбранное значение с помощью указанного свойства:

// Will select the item in model.Equipments that matches Model.EquipmentId
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments); 

Еще один комментарий:

У вас нет ICollection<Equipment> Equipments в вашей модели просмотра. У вас должно быть свойство, которое возвращает IEnumerable<SelectListItem>.

Ответ 3

Если вы хотите добавить представление (aspx file), где будет находиться этот DropDownList или DropDownListFor, щелкните правой кнопкой мыши → добавить представление, затем выберите "Создать строго типизированное представление", затем в списке выберите Booking класс. После этого добавьте эту страницу.

Вы можете написать в нем следующим образом:

@Html.DropdownListFor(m => m.Equipments , Model.Equipments);

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

m => m.ID, m => m.Room, m => m.StartTime

... и т.д.

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

ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable();

Ввод AsEnumarable() в конец вашего списка, взятого из базы данных, делает его IEnumarable.

Тогда, на ваш взгляд, вы также можете:

@Html.DropdownList("MyEquipments" , ViewData["Equipments"]);

Ссылка на использование ViewData: http://msdn.microsoft.com/en-us/library/dd410596.aspx

Я надеюсь, что это поможет вам.

Ответ 4

DropdownListFor поддерживает сильно тип и присваивает имя lambda Expression, поэтому он показывает ошибку времени компиляции, если есть какая-либо ошибка.

DropdownList не поддерживает это.