Итак .. У меня проблема. Я уверен, что почти любой, кто пробовал MVC, имел это. Тем не менее, мне не удалось найти решение или подумать о нем для себя.
Проблема в следующем: у меня есть список текстовых полей, которые я бы хотел отредактировать сразу, и я также хотел бы добавить новые элементы в свой список. Однако после первой обратной передачи текстовая привязка не выполняется.
Итак, я сделал небольшой пример, чтобы проиллюстрировать проблему:
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<% foreach(string s in Model) { %>
<p>
<%= Html.TextBox("list",s) %>
</p>
<% } %>
<p>
<%= Html.TextBox("newstr") %>
</p>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
Код контроллера:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit()
{
return View(new List<string>() { "aa", "bb", "cc" });
}
// Remove empty strings and add the new one
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(List<string> list, string newstr)
{
List<string> res = list.Where(s => !string.IsNullOrWhiteSpace(s)).ToList();
if (!string.IsNullOrWhiteSpace(newstr))
res.Add(newstr);
return View(res);
}
Итак, при первом GET я возвращаю 3 строки aa, bb и cc и получаю 3 текстовых поля с их текстом, а также пустое текстовое поле для новых строк, например:
aa
bb
cc
Empty.
Теперь, если я очищу строку bb и добавлю «dd» в пустое текстовое поле, я получу список возврата «aa», «», «cc» и «dd» в newstr. Это возвращает новый список «aa», «cc», «dd», который я и ожидал увидеть в своих флажках. Вместо этого я получаю:
aa
aa
aa
dd (expected empty)
Итак ... Есть что-то фундаментальное, чего я не понял :) Почему он игнорирует мою новую модель данных и использует некоторые старые и не все?
Полагаю, это какой-то остаток состояния просмотра с asp.net, так как мне его отключить? Я действительно хочу, чтобы веб-страница без гражданства рекламировалась.