2010-06-15 6 views
2

Je suis nouveau sur ASP.net MVC et j'ai du mal à faire fonctionner correctement les listes déroulantes.Html.DropDownListPour ne pas se comporter comme prévu ASP.net MVC

j'avoir une vue fortement typé qui tente d'utiliser un Html.DropDownListFor comme suit:

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

Je peuplant la liste avec une propriété dans mon modèle comme suit:

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 

Le Select Case fonctionne find et il définit le SelectListItem comme sélectionné, mais lorsque ma vue affiche la liste déroulante, peu importe ce qui est marqué comme sélectionné, le HTML généré n'a rien sélectionné. Je suis évidemment en train de faire quelque chose de mal ou de manquer quelque chose, mais je ne peux pas pour la vie de comprendre ce que je veux dire.

Répondre

2

Il s'avère que j'ai dû écrire un helper de liste déroulante. J'ai trouvé l'article here. Voici mon code au cas où quelqu'un d'autre en aurait besoin. Il est grossièrement traduit en VB à partir de l'exemple C# de l'article.

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 
1

Essayez ceci:

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 
+0

Cela n'a pas fonctionné. La liste déroulante a été remplie avec deux options contenant System.Web.Mvc.SelectListItem (par exemple, ) Aucune valeur ne lui était associée. J'apprécie l'aide au passage. – rybl

+0

Modifiez cette ligne: Retour Nouvelle SelectList (liste, Me.Arrdep) à ceci: Retour Nouvelle SelectList (liste, « texte », « Valeur », Me.Arrdep) –

+0

Ce résolu le problème avec lui montrant , mais il ne sélectionne toujours pas le champ approprié par défaut. Merci encore pour votre aide. – rybl

0

Le type de paramètre du constructeur SelectList 4-ème est l'objet, mais il veut sans doute un objet du même type que les objets de la liste (param 1 er). Par conséquent, la syntaxe correcte doit être la suivante:

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 
+0

J'apprécie vraiment l'aide, mais cela a toujours le même comportement. Si je sélectionne quelque chose, la valeur est correctement définie et lorsque je parcours la propriété ArrdepOptions, tout fonctionne comme prévu, mais lorsqu'il restaure la vue, rien n'est encore sélectionné dans le code HTML généré. – rybl

+0

Juste avant de faire plus de vérification - devinez rapidement: 'Case ArriveDepart.Arrive: Return New SelectList (liste, "Text", "Value", arriveListItem)' à 'Case ArriveDepart.Arrive: Return New SelectList (liste, " Text "," Value ", arriveListItem.Value) 'et ' Case Else: Retourne une nouvelle liste SelectList (liste," Text "," Value ", departListItem) 'à' Case Sinon: Return New SelectList (liste," Texte ", "Value", departListItem.Value) ' – Yakimych

+0

Toujours le même comportement ... – rybl

Questions connexes