Разница между DropDownlist или DropDownListFor Html помощник - PullRequest
41 голосов
/ 18 ноября 2011

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

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

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, но не уверен, почему и как?

Ответы [ 4 ]

84 голосов
/ 22 ноября 2011

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

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

и

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

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

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

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

6 голосов
/ 18 ноября 2011

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

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

Другой комментарий:

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

2 голосов
/ 18 мая 2016

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

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

2 голосов
/ 22 ноября 2011

Если вы хотите добавить представление (aspx файл), где этот 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

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...