【发布时间】:2017-10-04 08:36:10
【问题描述】:
假设我们有Create 和Edit 操作方法,它们由HttpPost 赋予属性,并且它们有一个model 类型的参数,例如BlogViewModel,如下所示。
[HttpPost]
public IActionResult Create(..., BlogViewModel model)
{
....
}
[HttpPost]
public IActionResult Edit(..., BlogViewModel model)
{
....
}
在他们的身体里,我们通常做如下验证。
if(ModelState.IsValid)
{
// do something
}
这里,do something 可以是访问model 的属性的操作。
问题
我不确定model 是否有可能变成null。如果model是null那么do something(比如访问model的属性)会抛出异常。
我读了很多例子(来自互联网和教科书),我还没有看到有人做如下仔细检查。
if(model!=null)
{
if(ModelState.IsValid)
{
// do something
}
}
或
if(ModelState.IsValid)
{
if(model!=null)
{
// do something
}
}
很可能,ModelState.IsValid 是true 的条件保证了model 不是null。
我的假设是否正确?恐怕我在做一个定时炸弹的假设。
【问题讨论】:
-
如果你的代码有其他错误,模型只会是
null -
@StephenMuecke:那么是否有必要按照我上面的代码所示进行仔细检查?或者
ModelState.IsValid=true不保证model != null? -
其实ModelState.IsValid会检查ModelState中是否添加了错误,所以在model可以为空的情况下,即使model为null,ModelState也是有效的。但是,在您的情况下,您的帖子请求中需要 BlogViewModel ,因此具有空模型的请求将引发异常。因此,在这种情况下,您无需检查模型是否为空。
-
ModelState是有效的模型是null(只有当ModelBinder试图设置无效的属性值时才无效)。如果请求中没有传递与模型属性名称匹配的值,或者如果您将参数命名为与模型中的属性之一相同,则模型将为null。 -
我个人认为没有必要(并且从未见过任何例子)。在上面的第二种情况下,您将在发布之前进行更正,如果在请求中没有发送与您的模型属性匹配的值,您可以假设它是恶意用户,那么如果他们看到将由异常导致的错误页面怎么办.
标签: c# asp.net-mvc asp.net-core-mvc