4

Обычно я бы привязать данные к DropDownListFor с SelectList:Сильно типизированная привязка к DropDownListFor?

@Html.DropDownListFor(model => model.CustomerId, new SelectList(Model.Orders, "OrderId", "ItemName")) 

Есть ли способ сделать это с помощью строго типизированных лямбды, а не со строками собственности. Например:

@Html.DropDownListFor(model => model.CustomerId, new SelectList(Model.Orders, x => x.OrderId, x => x.ItemName)) 
+1

не думаю есть. SelectList должен знать имена свойств свойства и описания, чтобы он мог привязывать эти свойства к элементу управления/иметь его в своей коллекции. вы, возможно, вместо этого вместо этого создадите пользовательский метод отображения или расширения, но все же считаете, что вам нужно на каком-то уровне рассказать ему, какие свойства идентификатора и имена свойств отображения/описания находятся на объекте, который вы пытаетесь связать. Другое решение, возможно, забыть, используя dropdownlistfor, и просто зацикливать на него вместо html. –

ответ

10

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

public IEnumerable<SelectListItem> OrdersList { get; set; } 

код в контроллере будет выглядеть следующим образом:

model.OrdersList = db.Orders 
        .Select(o => new SelectListItem { Value = o.OrderId, Text = o.ItemName }) 
        .ToList(); 

В представлении вы можете использовать его как это:

@Html.DropDownListFor(model => model.CustomerId, Model.OrderList) 

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

+0

Спасибо. Да, я сделаю все, чтобы избежать магических струн. – davenewza

0

Для этого не существует перегруженного конструктора. Но нет никакого вреда в ручном задании DataTextField и DataValueField в виде строки?

+0

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

+2

Согласитесь с ремонтопригодностью, настройка DataTextField и DataValueField уже довольно давно происходит от Winforms до Asp.net и т. Д., Поэтому, возможно, найти способ сделать это, как вы предлагаете, было бы полезно. – Ric

0

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

вот пример этого ..............

@Html.DropDownList("department", (IEnumerable<SelectListItem>)@ViewBag.DepartmentList, new { value = @ViewBag.department, style = "width:140px", onchange = "OnDepartmentChange(this)" }) 

контроллер в методе индекс вы можете написать как

ViewBag.Department = department; 
+0

Ric Thanks ........ –

+0

Умение читать при форматировании правильно. – Ric

+0

Я вызывающе чувак мы можем поделиться нашим Skype –

Смежные вопросы