Nano Hash - криптовалюты, майнинг, программирование

ASP.NET MVC ModelState с методами GET / POST и блоками try-catch

У меня возникли проблемы с работой MVC modelstate с процессом входа на веб-сайт. У меня типичный экран входа в систему с полями для имени пользователя и пароля. Контроллер учетных записей имеет 2 метода обработки входов в систему. Первый - это метод Get под названием «LogOn ()», который просто возвращает представление входа в систему (которое является именем пользователя / pw), а второй также называется «LogOn (FormCollection values)», но он имеет [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, и View правильно выполняет код, но после этого каким-то образом вызывается метод Get Logon (), который затем перезаписывает все и просто отображает View, как если бы это был пользователи впервые заходят на страницу!

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

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();
} 

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


  • Во-первых, почему вы используете try ... catch для входа в систему, почему бы просто не вернуть логическое значение loginProcess ()? Во-вторых, я не уверен, что понимаю, что именно происходит, правильно ли отображается представление и отправляется клиенту? Клиент тогда выполняет перенаправление? Или представление как-то перезаписывается перед отправкой клиенту? 19.01.2010
  • Привет, Рори, спасибо за быстрый ответ! Причина блока try / catch вокруг loginProcess заключается в обнаружении различных исключений, которые могут возникать на протяжении всего процесса, таких как неправильное имя пользователя / pw, исключения базы данных и т. Д. Firebug сообщает мне, что сообщение происходит правильно и возвращается в клиент. После этого запрашивается GET для входа в систему, который выполняет перезапись. Однако HTML в ответе от POST есть все, кроме моего сообщения об ошибке. В HTML у меня есть ‹% = Html.ValidationMessage (keyName)%›. Спасибо еще раз за помощь! 19.01.2010

Ответы:


1

Вам нужно явно указать значение. Пример имени пользователя:

ModelState.SetModelValue(
    "username", 
    new ValueProviderResult(username, username, CultureInfo.InvariantCulture));
19.01.2010
  • Привет, Дарин, спасибо за ответ. Я попытался добавить указанную выше строку отдельно, а также попытался сделать это сначала с помощью AddModelError (). Потому что, если вы просто попробуете SetModelValue (), тогда ModelState.IsValid не получит значение false. Однако это не устранило проблему, и перезапись вызова Get все еще происходит. Любые другие идеи ?? 19.01.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..