Исключение при рендеринге Html.CheckBoxFor с неверным вводом: строка не была распознана как допустимое логическое значение - PullRequest
0 голосов
/ 20 февраля 2019

Мое приложение MVC5 сканируется / спамится, и я получаю тысячи исключений в своих журналах.Как я могу решить эту проблему?

Вот моя модель:

public class MyModel
{
  public bool IsRememberMe { get; set; }
}

Вот мой взгляд:

@Html.CheckBoxFor(m => m.IsRememberMe)

Вот мой поступок:

[HtmlPost]
public ActionResult MyAction(MyModel model)
{
  if (ModelState.IsValid)
  {
    // Do work
  }

  return View(model);
}

Когда спамер отправляет вручную, значение, такое как «IsRememberMe = foo» в POST, ModelState.IsValid==false, как ожидается, и model.IsRememberMe==false, как ожидается.Однако при рендеринге результирующего представления Html.CheckBoxFor(m => m.IsRememberMe) выдает исключение:

System.InvalidOperationException: преобразование параметра из типа 'System.String' в тип 'System.Boolean' не выполнено.

Внутри контроллера, если я добавлю:

string value = ModelState["IsRememberMe"].Value.AttemptedValue;

, тогда value равно foo (входное значение).

Обратите внимание, что в нормальных условиях всеработает правильно.

Похоже, Html.CheckBoxFor() извлекает значение из ModelState, а не model.IsRememberMe.

Как лучше всего решить эту проблему?

Обновление

Судя по комментариям и отзывам, похоже, что использование данных из ModelState разработано специально.Я в порядке с этим при нормальных обстоятельствах.

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

Я пытаюсь предотвратить исключение в MVC, вызванное предоставлением неверных данных.Я публикую свой ответ ниже.

1 Ответ

0 голосов
/ 20 февраля 2019

Я думаю, что это ошибка в реализации Html.CheckBoxFor().Извлечение данных из ModelState возможно, однако, если данные не могут быть преобразованы, тогда следует использовать значение из модели вместо того, чтобы выдавать исключение, которое останавливает рендеринг представления.

Я не могуПодумайте о случае использования, в котором желательно генерировать исключение (предотвращающее рендеринг представления), если значение в ModelState не может быть преобразовано в отмеченный / незарегистрированный флажок.Я был бы рад услышать от любого, у кого есть такой вариант использования.

Решение

Из-за простоты используемого типа данных (bool) мы можем удалить значениес ModelState, если мы собираемся перерисовать представление.Это удалит ошибочное значение.

[HtmlPost]
public ActionResult MyAction(MyModel model)
{
  if (ModelState.IsValid)
  {
    // Do work
  }

  if (ModelState.Keys.Contains("IsRememberMe"))
  {
    ModelState.Remove("IsRememberMe");
  }

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