2009-03-17 5 views
27

[Je résolu moi-même, voir ma réponse pour la cause]modèle ASP.NET MVC lier un paramètre IList <>

Je vais avoir du mal à obtenir des valeurs de formulaire pour un IList <> argument dans une méthode de commande régler correctement.

Ma classe de contrôleur ressemble à ceci:

public class ShoppingBasketController : Controller { 

    public ActionResult Index() { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Add(IList<ShoppingBasketItem> items) { 
     Session["basket"] = items; // for testing 
     return RedirectToAction("Index"); 
    } 
} 
public class ShoppingBasketItem { 
    public int ItemID; 
    public int ItemQuantity; 
} 

La forme légèrement garni:

<% using (Html.BeginForm("Add", "ShoppingBasket")) { %> 
    <% int codeIndex = 0; 
    foreach (Product product in products) { %> 
     <%= Html.Hidden("items[" + codeIndex + "].ItemID", product.Id) %> 
     <%= Html.TextBox("items[" + codeIndex + "].ItemQuantity", "0", new { size = "2"}) %> 
     <% codeIndex++; 
    } 
} %> 

qui produit le balisage comme:

<form action="/Basket/Add" method="post"> 
    <input id="items[0]_ItemID" name="items[0].ItemID" type="hidden" value="1" /> 
    <input id="items[0]_ItemQuantity" name="items[0].ItemQuantity" size="2" type="text" value="0" /> 

    <input id="items[1]_ItemID" name="items[1].ItemID" type="hidden" value="2" /> 
    <input id="items[1]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" /> 

    <input id="items[2]_ItemID" name="items[2].ItemID" type="hidden" value="3" /> 
    <input id="items[2]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" /> 
</form> 

J'ai vérifié les valeurs de formulaire être soumis et ils sont corrects. Le nombre correct de ShoppingBasketItem est également mis dans Session["basket"], cependant les deux ItemID et ItemQuantity sont zéro. Il semble décoder correctement la liste des valeurs de formulaire, mais pas les propriétés elles-mêmes. J'utilise MVC RC2, et basé sur un article by Scott Hanselman je suis assez sûr que mon code est correct. Est-ce que je manque quelque chose?

+0

Y at-il un moyen de faire ce travail avec des modèles d'interface utilisateur, en utilisant un EditorFor (m => m.product) pour chaque itération dans les produits? –

+0

Merci. J'ai trouvé cela vraiment utile. :) –

Répondre

35

Solution

Après avoir téléchargé la source MVC, je ne pouvais toujours pas pourquoi cela ne fonctionnerait pas, alors je présume qu'il doit être quelque chose à voir avec le type que je tentais de se lier. Effectivement, les valeurs étant les variables membres, par opposition aux propriétés, était le coupable. Cela est dû au fait que le classeur de modèle utilise la réflexion pour définir les propriétés qu'il ne trouvait pas lors de l'appel à TypeDescriptor.GetProperties(Type).

Mise à jour de la classe de valeur à cette résolu le problème (après les heures de mur frapper la tête hors Je dois ajouter !!):

public class ShoppingBasketItem { 
    public int ItemID { get; set; } 
    public int ItemQuantity { get; set; } 
} 
+0

J'avais toujours entendu dire que les variables de membre public n'étaient pas binaires équivalentes aux propriétés publiques (c'est un changement de rupture), et maintenant je suppose que je suis convaincu. –

+0

C'est le seul exemple complet que j'ai trouvé. Tous les autres articles de blog ont des morceaux de l'image entière. –

+0

Merci beaucoup! Je me cognais la tête sur la table pendant des heures pour essayer de comprendre ce qui n'allait pas. – Giablo

Questions connexes