我的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中由于提交无效数据而引起的异常。我在下面发布自己的答案。
答案 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);
}