Pregunta

[Resolví esto yo mismo, mira mi respuesta por causa]

Tengo problemas para obtener valores de formulario para una IList < > argumento en un método de controlador configurado correctamente.

Mi clase de controlador se ve así:

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 forma ligeramente recortada:

<% 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++;
    }
} %>

Que produce marcado como:

<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>

He comprobado los valores del formulario que se envían y son correctos. El número correcto de ShoppingBasketItem s también se pone en Sesión [" basket " ], sin embargo, tanto el ItemID como el ItemQuantity de cada uno son cero. Parece que decodifica correctamente la lista de valores de formulario, pero no selecciona las propiedades en sí.

Estoy usando MVC RC2, y basado en un artículo de Scott Hanselman I Estoy bastante seguro de que mi código es correcto. ¿Me estoy perdiendo algo?

¿Fue útil?

Solución

Solución

Después de descargar la fuente MVC todavía no podía ver por qué no funcionaría, así que supuse que debía ser algo relacionado con el tipo que estaba intentando vincular. Efectivamente, los valores como variables miembro, en oposición a las propiedades, fueron los culpables. Esto se debe a que el archivador de modelos usa la reflexión para establecer propiedades, que no encontró a través de la llamada a TypeDescriptor.GetProperties (Type) .

La actualización de la clase de valor para esto lo resolvió (¡después de horas de golpear la cabeza, debería agregar!):

public class ShoppingBasketItem {
    public int ItemID { get; set; }
    public int ItemQuantity { get; set; }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top