ASP.NET MVC 1.0 - Связыватель моделей для словарей - PullRequest
5 голосов
/ 22 января 2010

У меня есть 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++) {...}.

1 Ответ

1 голос
/ 04 марта 2011

Решение описывается в этой статье - Связыватель модели словаря в ASP.NET MVC2 и MVC3

Код общего назначения и может использоваться также с MVC 1.

...