ASP.NET la liaison de modèle MVC IList<> paramètre
[J'ai résolu ce problème moi-même, voir ma réponse pour cause]
Je vais avoir de la difficulté à obtenir les valeurs d'un formulaire pour une IList<> argument à une méthode de contrôleur correctement réglé.
Mon contrôleur de classe 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;
}
Légèrement rogné forme:
<% 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 de la majoration 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é la forme des valeurs qui sont soumis et qu'ils sont corrects. Le nombre exact de ShoppingBasketItem
s aussi se mettre en Session["basket"
], toutefois, la ItemID
et ItemQuantity
de chacun sont égaux à zéro. Il semble être correctement décodage de la liste de valeurs d'un formulaire, mais pas de ramasser les propriétés elles-mêmes.
Je suis en utilisant MVC RC2, et basé sur un l'article de Scott, Hanselman je suis sûr que mon code est correct. Ai-je raté quelque chose?
- Est-il un moyen de faire ce travail avec les modèles d'INTERFACE utilisateur, à l'aide d'un EditorFor(m => m.produit) pour chaque itération de Produits?
- Merci. J'ai trouvé cela vraiment utile. 🙂
Vous devez vous connecter pour publier un commentaire.
Solution
Après avoir téléchargé le MVC source, je ne pouvais toujours pas voir pourquoi ça ne marcherait pas, donc je présume qu'il doit y avoir quelque chose à voir avec le type I a été d'essayer de se lier. Bien sûr, les valeurs des variables membres, par opposition aux propriétés, était le coupable. C'est parce que le modèle de classeur utilise la réflexion pour définir les propriétés, qu'il n'était pas de trouver à travers l'appel à
TypeDescriptor.GetProperties(Type)
.La mise à jour de la classe de valeur à cette résolu (après des heures de frapper la tête hors mur, devrais-je ajouter!!):