Переоцените свойство ModelState.IsValid - PullRequest
6 голосов
/ 08 марта 2011

Я пытаюсь подтвердить, что пользователь меняет свой пароль. Класс PasswordChange, который получает этот actionresult, имеет 4 свойства. одним из которых является databasePassword, который сравнивается со свойством «CurrentPassword», которое гарантирует, что пользователь может изменить свой пароль, только если он знает свой текущий пароль (довольно стандартная процедура на веб-сайтах)

Проблема у меня в том, что пароль базы данных устанавливается (как показано) только внутри ActionResult, но ModelState, кажется, вызывается до этого, поэтому он возвращает false в «IsValid», поскольку он видит пароль базы данных как «NULL» даже после пароль базы данных установлен

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult ChangePassword(PasswordChange model)
    {
        var User = GetPlayer().User;
        model.databasePassword = User.Password; 

        if (ModelState.IsValid)
        {
            //update the users password
            User.Updated = SystemDate.Current();
            User.Password = model.newPassword.ToLower();

            return Redirect("/Player");
        }
        else
        {
            return View(model);
        }
    }

Как мне переоценить это или заставить его оценить, когда я этого хочу!

Ответы [ 3 ]

2 голосов
/ 12 декабря 2012

Проверьте ошибку и удалите ее, если ваше назначение исправило ее.Упрощенная проверка:

model.databasePassword = User.Password;
if (ModelState["databasePassword"].Errors.Count == 1)
{
    ModelState["databasePassword"].Errors.Clear();
}
1 голос
/ 08 марта 2011

Создайте класс модели представления PasswordChangeInput и передайте то, что вам нужно, из представления, после чего вы можете получить отдельную проверку от вашей модели сущности. Затем вы можете использовать что-то вроде automapper, чтобы отобразить модель входного представления в модель сущности после того, как вы удовлетворены, что входные данные верны.

Для добавления: вы можете попытаться устранить ошибки ModelState, установить пароль базы данных и выполнить повторную проверку. Вероятно, легче выяснить, что является причиной того, что связыватель модели по умолчанию добавляет ошибку для databasePassword и изменяет ее так, чтобы это не происходило.

0 голосов
/ 24 января 2012

Я знаю, что это старый пост, но я нашел другое решение, которое может помочь кому-то, кто борется с тем же сценарием.

Условная проверка с аннотациями данных в ASP.NET MVC

или путем создания расширения ModelState

ASP.NET MVC - исключая правила проверки модели

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