2017-10-04 70 views
2

假设我们有CreateEdit动作方法归于HttpPost并且它们具有model类型的参数,例如BlogViewModel,如下所示。ModelState.IsValid = true是否保证传递的模型参数不为null?

[HttpPost] 
public IActionResult Create(..., BlogViewModel model) 
{ 
.... 
} 

[HttpPost] 
public IActionResult Edit(..., BlogViewModel model) 
{ 
.... 
} 

在他们的身体里,我们通常会做如下验证。

if(ModelState.IsValid) 
{ 
// do something 
} 

在这里,do something可以访问model的性质的操作。

问题

我不知道是否有在这model成为null的可能性。如果modelnull然后do something(诸如访问的model一个属性)将抛出异常。

我读了很多的例子(从互联网和教科书),我还没有看到有人这样做仔细检查尚未如下。

if(model!=null) 
{ 
    if(ModelState.IsValid) 
    { 
    // do something 
    } 
} 

if(ModelState.IsValid) 
{ 
    if(model!=null) 
    { 
    // do something 
    } 
} 

也许,条件ModelState.IsValidtrue保证modelnull

我的假设是否正确?恐怕我正在做一个定时炸弹的假设。

+1

该模型将只'null'如果有与您其他错误代码 –

+0

@StephenMuecke:所以有必要总是做仔细检查所示我上面的代码?或'ModelState.IsValid = true'不能保证'model!= null'? –

+0

无论如何,检查'null'通常是个好主意。假设它不应该是'null',一切进展顺利,但重构或其他错误配置(例如路由)可能会导致它为空。 – DiskJunky

回答

3

要回答你的问题,不,ModelState.IsValid不检查,如果你的模型是空,如果出现这种情况会引发错误。

在API这是很容易产生空的模型,如果你犯了一个错误,同时建立您的请求模型,它不匹配端点所期待的。

或其他人可以看看你的网站,看到API调用,并决定有一些乐趣和与不具备有效的模型请求淹没你的API。

有办法检查空模型在一个地方,如这里:ModelState is valid with null model

1

什么是模型状态? ModelState代表在POST期间提交给服务器的名称和值对的集合

ModelState中有什么? 以下是这些价值观的样子,从相同的调试会话: 属性enter image description here 每个人都有一个包含提交给服务器的实际值ValueProviderResult的一个实例。

模型状态验证错误... 如: -

[Required] 
public string FirstName { get; set; } 

[StringLength(50, ErrorMessage = "The Last Name must be less than {1} characters.")] 
public string LastName { get; set; } 
在这种情况下,如果你的名字包含超过50个caracters,ModelState中如有虚假

,因为有例外vaueProvidedResult

希望你得到的低估有关的ModelState

回答你的问题是你可以处理模型从modelState

如果模型null自动modelState无效

+0

OP没有问'ModelState'是什么! –

+0

@StephenMuecke是整个问题的答案,他需要了解你可以处理模型modelState –

+0

_if模型null自动modelState不valid_错误 –

1

答案根本不是。

ModelState表示尝试将发布的表单(标记为BeginForm)绑定到还包含验证信息的操作方法。它包含默认模型联编程序设置,其指定应将哪些验证设置包括在视图模型中,例如, RequiredAttribute,以便对所需字段进行空值检查取决于存在哪些验证设置,而不是在ModelStateDictionary本身。

当提交表单时,DefaultModelBinder设置viewmodel绑定并检查绑定viewmodel类内的每个属性是否存在验证设置(即属性)。如果提交的值与设置的标准不匹配(例如null /标记为RequiredAttribute的属性中的空值),则会将验证错误添加到ModelState.Errors属性,并且随后ModelStateDictionary.IsValid返回false,因为它取决于Errors属性计数。这里是从IsValid采取ModelStateDictionary source检查机制:

public class ModelStateDictionary : IDictionary<string, ModelState> 
{ 
    private readonly IDictionary<string, ModelState> _innerDictionary; 

    public ICollection<ModelState> Values 
    { 
     get { return _innerDictionary.Values; } 
    } 

    public bool IsValid 
    { 
     get { return Values.All(modelState => modelState.Errors.Count == 0); 
    } 
} 

因此,如果所有的模型属性设置为空/空而不指定RequiredAttribute,由于没有验证ModelStateDictionary.IsValid值仍然true属性本&模型结合的作品。

类似的问题:

ModelState.IsValid even when it should not be?

相关问题