ASP.NET MVC ModelState с методами GET / POST и блоки try-catch - PullRequest
0 голосов
/ 19 января 2010

У меня проблемы с настройкой состояния модели MVC при входе в систему на веб-сайте. У меня типичный экран входа в систему с полями для имени пользователя и пароля. В Account Controller есть 2 метода для обработки входов. Первый - это метод Get с именем «LogOn ()», который просто возвращает представление входа в систему (которое является именем пользователя / pw), а второй также называется «LogOn (значения FormCollection)», но он имеет [AcceptVerbs (HttpVerbs.Post). )] указано.

Таким образом, если пользователь пытается войти без ввода имени пользователя и / или pw, метод post проверяет это и добавляет ошибки в ModelState через ModelState.AddModelEror (). Это первое, что происходит, и после того, как это было проверено, если ModelState.IsValidated () имеет значение false, тогда я просто возвращаю View ().

//(validate just adds to Modelstate when values are null)
if (!ValidateLogOn(userName, password)) 
   return View();

Теперь, это прекрасно работает, если любой из них пуст, то страница просто возвращается и отображает правильное сообщение об ошибке, используя HtmlValidationMessage (keyName). Проблема в том, что после того, как это проверено, я затем выполняю реальный вызов входа в систему, чтобы запустить процесс аутентификации для предоставленного имени пользователя / pw, которое заключено в блок try / catch. Если в этом процессе происходит ошибка, я хотел бы добавить ошибку в ModelState и вернуть View (), как я это делал выше. Ошибка успешно добавляется в ModelState, и представление корректно проходит через код, но после этого как-то вызывается метод Get Logon (), который затем перезаписывает все и просто отображает представление, как если бы оно было пользователи впервые заходят на страницу!

Таким образом, общий процесс кода аналогичен приведенному ниже:

public ActionResult LogOn()
{
   return View();
}

public ActionResult LogOn(FormCollection values)
{
    if (!ValidateLogOn(userName, password))
       return View();

    try {
        loginProcess(username, password);
    }
    catch (Exception e) {
        ModelState.AddModelError(keyName, "Error Message");
        return View();
    }

   return View();
} 

Любая помощь или понимание того, почему этот процесс работает так, как он работает, будет принята с благодарностью, спасибо !!

1 Ответ

0 голосов
/ 19 января 2010

Вам необходимо явно установить значение. Пример для имени пользователя:

ModelState.SetModelValue(
    "username", 
    new ValueProviderResult(username, username, CultureInfo.InvariantCulture));
...