ModelState.IsValid работает в «новой» форме, но не в «редактируемой» форме - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть приложение ASP.NET MVC 2.0, использующее Entity Framework. Все мои представления используют модели представлений, большинство из них сложные. Значение ... редактируемый объект является свойством модели представления, а не самой модели представления.

Я использую частичные классы с аннотациями данных и проверяю ModelState.IsValid внутри действий POST в контроллере.

У меня есть форма "NEW" и форма "EDIT" для простого объекта с 3 полями!

Проверка ModelState.IsValid работает в новой форме и показывает правильные ошибки «обязательного поля», если я пытаюсь отправить пустую форму.

Но если я загружаю форму РЕДАКТИРОВАТЬ, очищаю значения из некоторых необходимых текстовых полей и отправляю форму, я НЕ получаю ошибки проверки, я просто получаю исключение:

Ошибка выполнения дочернего запроса для обработчика 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerWrapper'.

Итак, мой вопрос: не работает ли ModelState.IsValid с формой EDIT, поскольку, возможно, он просматривает значения из загруженного объекта модели представления вместо FormCollection?



    // this one does not validate

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(int accountStatusKey, AccountStatusEditViewModel model, FormCollection values)
        {
            if (ModelState.IsValid)
            {
                db.UpdateAccountStatus(accountStatusKey, values);
                return RedirectToAction("States");
            }
            else
            {
                return View("Edit", model);
            }
        }


    // this one does validate

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult New(AccountStatusNewViewModel model, FormCollection values)
        {
            if (ModelState.IsValid)
            {
                db.AddAccountStatus(values);

                return View("States", new AccountStatusStatesViewModel());
            }
            else
            {
                return View("New", model);
            }
        }

    // how I arrive AT the edit form

        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Edit(int accountStatusKey)
        {
            return View("Edit", new AccountStatusEditViewModel(accountStatusKey));
        }

    // and finally, the view model code

    public class AccountStatusEditViewModel : ViewModelBase
    {

        public AccountStatus AccountStatus { get; private set; }

        public IEnumerable States { get; private set; }

        public List StatusTypes { get; private set; }

        public AccountStatusEditViewModel(int accountStatusKey)
        {
            AccountStatus = db.GetAccountStatusByKey(accountStatusKey);
            States = db.GetAllStates();

            StatusTypes = new List();
            StatusTypes.Add("Primary Status");
            StatusTypes.Add("Secondary Status");
            StatusTypes.Add("External Status");
        }

        public AccountStatusEditViewModel()
        {
        }

    }

    // this action method does not work at all either - no db updating, no validation
    // the page simply redirects to "States" view, which should only happen if the db
    // was being updated, right?  But nothing is changing in the DB, and the validation
    // never happens.

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(AccountStatusEditViewModel model)
        {
            if (ModelState.IsValid)
            {
                if (TryUpdateModel(model, "AccountStatus"))
                {
                    return RedirectToAction("States");
                }
                else
                {
                    return View("Edit", model);
                }
            }
            else
            {
                return View("Edit", model);
            }

        }


Ответы [ 2 ]

0 голосов
/ 29 ноября 2010

Пожалуйста, исключите параметры FromCollection.Вы можете использовать ModelBinder по умолчанию для вашей модели представления.Asp.net MVC пытается отобразить значения из вашей формы в вашу модель.

Не могли бы вы опубликовать метод действия, который также приведет вас к форме редактирования?

0 голосов
/ 29 ноября 2010

Начиная с версии MVC 2.0, я больше не использую formcollection.

Я использую viewmodel в параметре действия, только когда у меня есть сообщение, например:

[HttpPost]
public ActionResult Activatecard(ActivateCardViewModel model)
{

Когда «это» не может создать мою модель (введено блабла для поля даты и времени или когда проверки не выполнены (я использую атрибуты проверки из пространства имен System.ComponentModel.DataAnnotations), я получаю ModelState.IsValid, равный false .

Я создал пустое приложение asp.net mvc2, и именно эту модель использовал стандартный шаблон для действия входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...