32

Je reçois totalement perdu et confus sur la façon d'utiliser le nouvel assistant Html.DropDownListFor fortement typé sur ASP.NET MVC 2.0 R2ASP.NET MVC 2 - Html.DropDownListFor confusion avec ViewModel

Dans la vue I « m éCRITURE:

<%= Html.DropDownListFor(m => m.ParentCategory, new SelectList(Model.Categories, "CategoryId", "Name", Model.ParentCategory), "[ None ]")%> 

<%= Html.ValidationMessageFor(m => m.ParentCategory)%> 

et mon objet modèle est donc:

public class CategoryForm : FormModelBase 
{ 
    public CategoryForm() 
    { 
     Categories = new List<Category>(); 

     Categories.Add(new CategoryForm.Category() { 
          CategoryId = 1, 
          Name = "CPUs" }); 
     Categories.Add(new CategoryForm.Category() { 
          CategoryId = 2, 
          Name = "Memory" }); 
     Categories.Add(new CategoryForm.Category() { 
          CategoryId = 3, 
          Name = "Hard drives" }); 
    } 

    // ...other props, snip... // 

    public Category ParentCategory { get; set; } 

    public IList<Category> Categories { get; protected set; } 

    public class Category 
    { 
     public int? CategoryId { get; set; } 
     public string Name { get; set; } 
    } 
} 

le problème est que lorsque je sélectionne un élément dans la liste déroulante, par exemple le premier élément, je reçois le Valida suivant Erreur "tionMessageFor" "La valeur '1' n'est pas valide."

Je changer la vue de ...

<%= Html.DropDownListFor(m => m.ParentCategory.**CategoryId**, 
           new SelectList .../ snip ) %> 

Maintenant, il fonctionne, un peu. La propriété ParentCategory de mon ViewModel est définie avec le 'CategoryId' correct mais le 'Name' est NULL. Suis-je préférable d'avoir juste un int nullable pour la propriété ParentCategory au lieu d'un objet 'Category' fortement typé?

+0

Ceci est un bonne façon d'utiliser DropDownListFor - http://stackoverflow.com/questions/3386998/dropdownlistfor-display-a-simple-list-of-strings – bcahill

Répondre

29

Je connaissais également le même problème.

Quand je déboguer l'action et regarde les ModelState.Values ​​[1] .Errors [0] .Exception par exemple, je vois ce qui suit:

{ "La conversion des paramètres de type 'System.String' de type 'System.Collections.Generic.KeyValuePair`2 [[System.String, mscorlib, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089], [System.Int64, mscorlib, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089]] 'a échoué car aucun convertisseur de type ne peut convertir entre ces types.}} System.Exception {System.InvalidOperationException}

Dans mon scénario, ma liste de sélection est créée à partir d'un dictionnaire et je l'utilise dans mon Voir:

<%=Html.DropDownListFor(x => x.MyDictionary, 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

Quand je l'ai changé:

<%=Html.DropDownListFor(x => x.MyDictionary.Keys, // <-- changed to .Keys 
          new SelectList(
           Model.MyDictionary, 
           "Value", 
           "Key")) %> 

Il a fonctionné sans problèmes.

Merci.

9
<%= Html.DropDownListFor(m => m.ParentCategory, 
           new SelectList(
            Model.Categories, 
            "CategoryId", 
            "Name", 
            Model.ParentCategory), 
          "[ None ]")%> 

Est-ce que vous essayez d'utiliser Model.ParentCategory.CategoryId comme dernier paramètre dans SelectList et de supprimer le paramètre [None]?

+0

ne remplace pas le "[None]" avec le CategoryId changer seulement la valeur par défaut/initiale valeur de la liste déroulante et non la valeur dans la vue modèle sur la publication? Était auparavant une downvote mais je l'ai repris dans un accès d'incertitude après avoir réalisé qu'il y a probablement une surcharge différente. Pouvez-vous clarifier un peu? –

8

Je me débarrasser de

public Category ParentCategory { get; set; } 

et faire une

public int? CategoryId { get; set; } 

à la place. Vous n'avez probablement besoin que de l'identifiant - vous pouvez toujours rechercher l'objet réel en utilisant l'identifiant comme clé (en utilisant un linq/lambda sur votre liste dans votre cas).

La vue aura alors ces deux:

<%= Html.DropDownListFor(m => m.CategoryId, 
           new SelectList(
            Model.Categories, 
            "CategoryId", 
            "Name", 
            Model.CategoryId), 
           "[ None ]")%> 

<%= Html.ValidationMessageFor(m => m.CategoryId)%> 
1

Si la SelectList est nulle dans le ViewModel J'ai aussi reçu l'erreur ci-dessus

Assurez-vous que le SelectList est réglé