В коде, который вы разместили, больше, чем вы думаете:)
Прежде всего, ваш код не одинаков все время, когда вы отображаете представление. В первый раз, вы будете исходить из этого метода, я полагаю:
[HttpGet]
public ActionResult Index()
Обратите внимание на HttpGet
. Вы не включили код этого метода, но я думаю, что вы получите данные для отображения, передадите их в ViewData.Model, а затем отобразите представление.
После первого поста этот метод полностью исключен. В случае ошибки вы визуализируете представление непосредственно из вашего HttpPost
метода, и это очень серьезный недостаток дизайна. Это напрямую не влияет на вашу проблему, но ее решение даст вам как рабочий код, так и лучший дизайн в целом.
В качестве предпосылки, я рекомендую вам зайти в Google по адресу PRG PATTERN , а затем продолжить читать здесь.
Некоторое время спустя ...
Теперь, когда вы являетесь экспертом и настоящим поклонником PRG PATTERN (я уверен, что вам это нравится), я дам вам несколько советов о том, как его реализовать, и о распространенных проблемах, которые вы могли бы столкнуться.
Прежде всего, ваш HttpGet
метод не изменится. Это почему? Здесь уже есть ответ от @archil, но я все равно объясню. Значения, содержащиеся в ModelState, имеют приоритет над ViewData.Model. Это сделано для сохранения ввода пользователя при повторном отображении формы.
Я знаю, что будет следующим, что придет вам в голову. При использовании шаблона PRG ModelState теряется при перенаправлении. Это правда. Вот почему ребята из MvcContrib сделали этот маленький волшебный ActionFilter, который заставляет все работать. Атрибут ModelStateToTempData
при применении к методу POST или даже ко всему контроллеру заставит сериализовать любой ModelState в методе POST в TempData и десериализовать обратно в первый метод GET, вызванный после этого.
Таким образом, у вас будет: POST -> Обработка данных / ошибка -> Сериализация ModelState -> Перенаправление на метод GET для отображения формы -> Десериализация TempData обратно в ModelState -> Прибыль.
Курсив - это то, что автоматически выполняется атрибутом ModelStateToTempData
.
Я уверен, что после того, как вы выполните рефакторинг своего кода в соответствии с паттерном PRG, ваша ошибка исчезнет, и вы добавите в свой набор очень полезный навык и предотвратите те неприятные сообщения «повторной отправки формы», которые вы встретимся в плохо продуманных формах.
Надеюсь, это поможет вам.