Il modello ASP.NET MVC che lega un IList < > parametro
-
19-08-2019 - |
Domanda
[Ho risolto questo problema da solo, vedi la mia risposta per causa]
Ho difficoltà a ottenere i valori del modulo per un IList < > argomento in un metodo controller impostato correttamente.
La mia classe di controller ha questo aspetto:
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 leggermente ritagliata:
<% 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++;
}
} %>
Che produce markup come:
<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>
Ho verificato i valori del modulo che vengono inviati e sono corretti. Anche il numero corretto di ShoppingBasketItem
viene inserito in Session [" basket "
], tuttavia sia ItemID
che ItemQuantity di ciascuno è zero. Sembra che stia decodificando correttamente l'elenco dei valori del modulo, ma non raccogliendo le proprietà stesse.
Sto utilizzando MVC RC2 e basato su un di Scott Hanselman I sono abbastanza sicuro che il mio codice sia corretto. Mi sto perdendo qualcosa?
Soluzione
Soluzione
Dopo aver scaricato la fonte MVC non riuscivo ancora a capire perché non avrebbe funzionato, quindi ho pensato che dovesse avere a che fare con il tipo che stavo tentando di associare. Abbastanza sicuro, i valori essendo variabili membro, al contrario di proprietà, era il colpevole. Questo perché il raccoglitore modello utilizza la riflessione per impostare le proprietà, che non ha trovato attraverso la chiamata a TypeDescriptor.GetProperties (Type)
.
L'aggiornamento della classe di valore a questo ha risolto (dopo ore di colpire la testa fuori dal muro dovrei aggiungere !!):
public class ShoppingBasketItem {
public int ItemID { get; set; }
public int ItemQuantity { get; set; }
}