Что не работает? Ваш код работает? Это генерирует строку?
У вас есть хотя бы одна опечатка, из-за которой сгенерированная строка не будет работать в HTML-форме. Должно быть <option value={0}>{1}</option>
Редактировать 2: Чтобы получить IDictionary(Of Object, String)
из ваших объектов EF, я бы написал частичные реализации классов, которые добавляют метод GetSelectOptions
к каждому из ваших объектов. Или создайте интерфейс с тем методом, который реализует каждый из ваших объектов EF. Затем вы просто вызываете метод RenderSelect
и передаете EFObject.GetSelectOptions
в качестве параметра SelectOptions
.
Редактировать: Вот как бы я это сделал. Сделайте ваш вызывающий код ответственным за чтение пар ключ / значение из вашего объекта EF. Тогда ваш метод расширения RenderSelect может быть намного чище. Вы не хотите, чтобы ваши вспомогательные методы представления зависели от структуры объектов вашей модели. И вы определенно не хотите, чтобы ваш вспомогательный метод зависел от того факта, что вы используете объекты EF.
Public Function RenderSelect(ByVal helper As HtmlHelper, _
ByVal name As String, _
ByVal SelectOptions As IDictionary(Of Object, String), _
ByVal SelectedKey As Object, _
ByVal htmlAttributes As IDictionary(Of String, Object)) As String
Dim result = <select name=<%= name %>/>
Dim optElement As XElement
For Each opt In SelectOptions
optElement = <option value=<%= opt.Key.ToString %>><%= opt.Value %></option>
If opt.Key.Equals(SelectedKey) Then
optElement.@selected = "1"
End If
result.Add(optElement)
Next
If htmlAttributes IsNot Nothing Then
For Each attr In htmlAttributes
result.SetAttributeValue(attr.Key, attr.Value)
Next
End If
Return result.ToString
End Function
Полный набор перегруженных функций DropDownList в VB.NET можно найти в этом файле из проекта vbmvc.codeplex.com, из которого был скопирован и изменен вышеуказанный код.
http://vbmvc.codeplex.com/sourcecontrol/changeset/view/19233?projectName=VBMVC#331689
Этот код имеет тип возврата XElement, но просто используйте result.ToString, чтобы получить строковое представление элемента, если вы этого хотите.