Ho un problema che in realtà non capisco. Ho un modello molto semplice che ha un elenco come membro pubblico. Ogni volta che il mio controller rimuove un elemento dal modello sul postback, gli helper HTML TextBoxFor() non sembrano raccogliere le modifiche. Sembra che questi aiutanti nascondano qualcosa, ma non riesco a puntare il dito su di esso.MVC4 TextBox HTML Per non funzionare dopo la modifica di ViewModel
una demo/Repro può essere trovato qui: http://broken.azurewebsites.net
Repro
- Spostarsi http://broken.azurewebsites.net
- Nota i valori 4 colonne popolati con zero valori basati
- premere il pulsante "test" POST indietro la pagina in cui rimuovo il primo elemento nell'elenco
- Avviso I valori "reali" sono corretti e l'elemento 0 ha è stato rimosso, tuttavia il problema qui è con i valori visualizzati tramite TextBoxFor(). Non riesco a capire perché restituisce 0 quando quell'elemento non esiste più.
modelle
public class ItemViewModel
{
public string Description { get; set; }
public decimal? Amount { get; set; }
}
public class TestViewModel
{
public TestViewModel()
{
Items = new List<ItemViewModel>();
}
public List<ItemViewModel> Items { get; set; }
}
controller
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new TestViewModel();
for (var i = 0; i < 4; i++)
{
model.Items.Add(new ItemViewModel { Description = i.ToString(), Amount = i });
}
return View(model);
}
[HttpPost]
public ActionResult Index(TestViewModel model)
{
model.Items.RemoveAt(0);
return View(model);
}
}
Visualizza
@model Demo.Models.TestViewModel
@using (Html.BeginForm())
{
<table>
<thead>
<tr><td>Description</td><td>Amount</td><td>Real-Description</td><td>Real-Amount</td></tr>
</thead>
<tbody>
@for (var i = 0; i < Model.Items.Count; i++)
{
var ii = i;
<tr>
<td>@Html.TextBoxFor(m => m.Items[ii].Description)</td>
<td>@Html.TextBoxFor(m => m.Items[ii].Amount)</td>
<td>@Model.Items[ii].Description</td>
<td>@Model.Items[ii].Amount</td>
</tr>
}
</tbody>
</table>
<button>Test</button>
}
Grazie, io sono sicuro che questo è il problema. Verificherò e riferirò. –