Html.DropDownListFor не работает должным образом ASP.net MVC

Я новичок в ASP.net MVC, и у меня возникают проблемы с правильной работой раскрывающихся списков.

У меня строго типизированное представление, которое пытается использовать Html.DropDownListFor следующим образом:

<%=Html.DropDownListFor(Function(model) model.Arrdep, Model.ArrdepOptions)%>

Я заполняю список свойством в моей модели следующим образом:

Public ReadOnly Property ArrdepOptions() As List(Of SelectListItem)
    Get
        Dim list As New List(Of SelectListItem)
        Dim arriveListItem As New SelectListItem()
        Dim departListItem As New SelectListItem()
        arriveListItem.Text = "Arrive At"
        arriveListItem.Value = ArriveDepart.Arrive
        departListItem.Text = "Depart At"
        departListItem.Value = ArriveDepart.Depart
        Select Case Me.Arrdep
            Case ArriveDepart.Arrive : arriveListItem.Selected = True
            Case Else : departListItem.Selected = True
        End Select
        list.Add(departListItem)
        list.Add(arriveListItem)
        Return list
    End Get
End Property

Select Case работает с поиском и устанавливает правильный SelectListItem как Selected, но когда мое представление отображает раскрывающийся список, независимо от того, что помечено как выбранное, в сгенерированном HTML ничего не выделено.

Я явно делаю что-то не так или что-то упускаю, но я не могу понять, что именно.


person rybl    schedule 15.06.2010    source источник


Ответы (3)


Оказывается, мне пришлось написать помощника для выпадающего списка. Я нашел статью здесь. Вот мой код на случай, если он понадобится кому-то другому. Это примерно переведено на VB из примера C # в статье.

Imports System.Linq.Expressions
Imports System.Runtime.CompilerServices

Namespace Helpers

    Public Module HtmlDropDownExtensions

        <Extension()> _
        Public Function EnumDropDownList(Of TEnum)(ByVal htmlHelper As HtmlHelper, ByVal name As String, ByVal selectedValue As TEnum) As MvcHtmlString

            Dim values As IEnumerable(Of TEnum) = [Enum].GetValues(GetType(TEnum))

            Dim list As New List(Of SelectListItem)
            For Each value As TEnum In values
                Dim selectListItem As New SelectListItem()
                selectListItem.Text = value.ToString()
                selectListItem.Value = value.ToString()
                selectListItem.Selected = (value.Equals(selectedValue))
                list.Add(selectListItem)
            Next
            Dim items As IEnumerable(Of SelectListItem) = list

            Return htmlHelper.DropDownList(name, items)

        End Function

        <Extension()> _
        Public Function EnumDropDownListFor(Of TModel, TEnum)(ByVal htmlHelper As HtmlHelper(Of TModel), ByVal expression As Expression(Of Func(Of TModel, TEnum))) As MvcHtmlString

            Dim metadata As ModelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData)

            Dim values As IEnumerable(Of TEnum) = [Enum].GetValues(GetType(TEnum))

            Dim list As New List(Of SelectListItem)
            For Each value As TEnum In values
                Dim selectListItem As New SelectListItem()
                selectListItem.Text = value.ToString()
                selectListItem.Value = value.ToString()
                selectListItem.Selected = (value.Equals(metadata.Model))
                list.Add(selectListItem)
            Next
            Dim items As IEnumerable(Of SelectListItem) = list

            Return htmlHelper.DropDownListFor(expression, items)

        End Function

    End Module

End Namespace
person rybl    schedule 25.06.2010

Попробуй это:

Public ReadOnly Property ArrdepOptions() As SelectList
    Get
        Dim list As New List(Of SelectListItem)()
        Dim arriveListItem As New SelectListItem()
        Dim departListItem As New SelectListItem()
        arriveListItem.Text = "Arrive At"
        arriveListItem.Value = ArriveDepart.Arrive
        departListItem.Text = "Depart At"
        departListItem.Value = ArriveDepart.Depart
        list.Add(departListItem)
        list.Add(arriveListItem)
        Return New SelectList(list, Me.Arrdep)
    End Get
End Property
person Johannes Setiabudi    schedule 16.06.2010
comment
Это не сработало. Выпадающий список был заполнен двумя вариантами, содержащими System.Web.Mvc.SelectListItem (т.е. ‹option› System.Web.Mvc.SelectListItem ‹/option›) Ни один из них не имел связанного с ним значения. Кстати, я ценю помощь. - person rybl; 17.06.2010
comment
Измените эту строку: Верните New SelectList (list, Me.Arrdep) на это: Return New SelectList (list, Text, Value, Me.Arrdep) - person Johannes Setiabudi; 17.06.2010
comment
Это устранило проблему с отображением ‹option› System.Web.Mvc.SelectListItem ‹/option›, но по-прежнему не выбирает правильное поле по умолчанию. Спасибо еще раз за помощь. - person rybl; 17.06.2010
comment
Я понял. Оказывается, вам нужно написать собственный выпадающий помощник, если вам интересно. - person rybl; 26.06.2010

Тип 4-го параметра конструктора SelectList - это Object, но ему, вероятно, нужен объект того же типа, что и объекты в списке (1-й параметр). Следовательно, правильный синтаксис должен быть таким:

Public ReadOnly Property ArrdepOptions() As SelectList
  Get
    Dim list As New List(Of SelectListItem)
    Dim arriveListItem As New SelectListItem()
    Dim departListItem As New SelectListItem()
    arriveListItem.Text = "Arrive At"
    arriveListItem.Value = ArriveDepart.Arrive
    departListItem.Text = "Depart At"
    departListItem.Value = ArriveDepart.Depart
    list.Add(departListItem)
    list.Add(arriveListItem)

    Select Case Me.Arrdep
        Case ArriveDepart.Arrive : Return New SelectList(list, "Text", "Value", arriveListItem)
        Case Else : Return New SelectList(list, "Text", "Value", departListItem)
    End Select

  End Get
End Property
person Yakimych    schedule 19.06.2010
comment
Я очень признателен за помощь, но поведение остается прежним. Если я выбираю что-то, значение устанавливается правильно, и когда я перехожу через свойство ArrdepOptions, все работает так, как ожидалось, но когда он фактически отображает представление, в сгенерированном HTML-коде ничего не выбирается. - person rybl; 21.06.2010
comment
Незадолго до того, как я сделаю дополнительную проверку - быстрое предположение: измените 'Case ArriveDepart.Arrive: Return New SelectList (list, Text, Value, прибытьListItem)' на 'Case ArriveDepart.Arrive: вернуть новый SelectList (список, текст, значение, прибытьListItem.Value ) 'и' Case Else: Return New SelectList (list, Text, Value, leaveListItem) 'в' Case Else: Return New SelectList (list, Text, Value, leaveListItem.Value) ' - person Yakimych; 21.06.2010
comment
Я понял. Оказывается, вам нужно написать собственный выпадающий помощник, если вам интересно. - person rybl; 26.06.2010