2013-07-16 4 views
0

J'essaie de travailler avec une liste déroulante Mois généré dans MVC. Mon viewmodel est:ASP.Net MVC voir le modèle pour dropdownlist?

public class MyViewModel{ 

    public MyViewModel() 
    { 
     var monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList(); 
Months = new SelectList(monthNames.Select(m=> new{Id=monthNames.IndexOf(m)+1, Name=m}).ToList(),"Id","Name"); 
    } 

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

    public string Month{ get; set; } 

} 

My View est:

@Html.DropDownListFor(model=>model.Month, new SelectList(Model.Months)) 

Le problème est que la propriété mois retourne toujours une valeur nulle de sorte que les erreurs de page lorsque vous essayez de rendre la LDD.

Cela semble assez simple. Qu'est-ce que je rate?

+0

Il n'y a rien de mal avec votre code, donc votre problème est probablement dans quelque chose que vous ne montrez pas. Est-ce que vous faites ceci dans une vue partielle par exemple? –

+0

Oui, il est dans un partiel –

+0

Pourquoi avons-nous besoin d'appeler .Take (12) .ToList()? –

Répondre

2

La propriété où vous définissez la propriété Months à quelque chose autre que la valeur nulle est manquante.

Vous devez simplement définir un getter personnalisé sur la propriété il revient toujours dénombrable:

public IEnumerable<SelectListItem> Months 
{ 
    List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList(); 
    foreach (var month in monthNames) 
    { 
     yield return new SelectListItem 
     { 
      Value = monthNames.IndexOf(month) + 1, 
      Text = month 
     }; 
    } 
} 
+0

Ya mon couper et coller m'a échoué et je n'ai pas bien preuve. J'ai édité mon exemple original. –

2

Comme autre solution possible en utilisant des modèles:

// in your model, decorate it to use the template 
[UIHint("MonthName")] 
public String Month { get; set; } 

Puis dans ~/Views/Shared/EditorTemplates/MonthName.cshtml:

@model String 
@Html.DropDown(
    String.Empty, 
    @Model, 
    new SelectList(
    System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames 
     .Where(x => !String.IsNullOrEmpty(x)) 
     .Select((x,y) => new { Text = x, Value = y + 1 }), 
    "Value", 
    "Text" 
) 
) 

Et enfin, à votre avis:

@Html.EditorFor(x => x.Month) 

bien que cela ne vaille vraiment la peine que sur les listes fixes (comme les mois), et pas pour les choses qui peuvent être dynamiques en fonction de la vue affichée.