Question

[J'ai résolu ce problème moi-même, voir ma réponse pour la cause]

Je ne parviens pas à obtenir les valeurs de formulaire d'un IList < > argument dans une méthode de contrôleur définie correctement.

Ma classe de contrôleurs 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 découpée:

<% 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 un balisage tel que:

<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 soumises et elles sont correctes. Le nombre correct de ShoppingBasketItem est également placé dans Session [" panier ], toutefois, ItemID et ItemQuantity de chacun sont zéro. Il semble décoder correctement la liste des valeurs de formulaire, mais ne pas sélectionner les propriétés elles-mêmes.

J'utilise MVC RC2 et est basé sur un article de Scott Hanselman . suis presque sûr que mon code est correct. Est-ce que je manque quelque chose?

Était-ce utile?

La solution

Solution

Après avoir téléchargé le source MVC, je ne comprenais toujours pas pourquoi cela ne fonctionnerait pas. J'ai donc supposé que cela devait être lié au type que je tentais de lier. Effectivement, les valeurs constituant les variables membres, par opposition aux propriétés, en étaient la cause. Cela s'explique par le fait que le classeur de modèle utilise la réflexion pour définir des propriétés, propriétés qu'il n'a pas découvertes via l'appel à TypeDescriptor.GetProperties (Type) .

La mise à jour de la classe de valeur a résolu ce problème (je devrais ajouter quelques heures après avoir heurté la tête du mur):

public class ShoppingBasketItem {
    public int ItemID { get; set; }
    public int ItemQuantity { get; set; }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top