使用无效输入呈现Html.CheckBoxFor时发生异常:无法将字符串识别为有效的布尔值

时间:2019-02-20 15:03:10

标签: c# validation model-view-controller

我的MVC5应用程序正在被扫描/发送垃圾邮件,我的日志中有1000多个异常。我该如何解决?

这是我的模特:

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

当垃圾邮件发送者手动提交时,POST中的值“ {IsRememberMe = foo”,预期的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 :(得分:-1)

我认为这是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);
}