У меня есть ViewModel класс, содержащий словарь (и другие несущественные для этого вопроса вопросы):
public class MyViewModel {
public Dictionary<int, string> Data { get; set; }
/* ... */
}
Тогда у меня есть пара GET
/ POST
действий, связанных со словарем. Действие GET
сначала заполнит Dictionary<int, string>
некоторыми данными из базы данных, а затем вернет View
:
-
.Key
s будет на скрытых полях ; и
-
.Value
s будет на текстовых областях для редактирования пользователем.
Затем пользователь отправит эту форму, вызвав действие POST
. Он попытается обработать ввод (процесс не имеет значения). Некоторые из пар Key
/ Value
будут действительными , некоторые будут недействительными .
Если есть недопустимые пары, действие POST
затем реконструирует ViewModel , но на этот раз словарь должен содержать только недопустимых пар и будет отображать то же представление для пользователя, чтобы исправить и попробуйте отправить снова.
Вопрос: Какой самый простой и чистый способ добиться этого?
Что у меня пока (работает нормально), в контроллере:
public ActionResult MyAction(MyViewModel vm) {
/* Process data */
if (are there invalid pairs?) {
var vmErrors = new MyViewModel();
/* ... fill the ViewModel ... */
vmErrors.Data =
vm.Data
.Where(x => IsInvalid(x))
.ToDictionary(x => x.Key, x => x.Value);
return View(vmErrors);
}
}
А вид:
<% var i = 0; foreach (var p in Model.Data) { %>
<%= Html.Hidden("vm.Data[" + i + "].key", vm.Key %>
<%= Html.TextArea("vm.Data[" + i + "].value", vm.Value %>
<% i++; } %>
Проблема в том, что, чтобы угодить подшивке модели , я должен назвать свои поля в представлении последовательными идентификаторами Но я также должен перебрать словарь для извлечения пар ключ / значение, поэтому это не может быть цикл for (var i = 0; i < Model.Data.Count; i++) {...}
.