ModelState.IsValid = true是否保证传递的模型参数不为null?

时间:2017-10-04 08:36:10

标签: c# asp.net-mvc asp.net-core-mvc

假设我们CreateEdit操作方法由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。如果nulldo something,则model(例如访问if(model!=null) { if(ModelState.IsValid) { // do something } } 的属性)将引发异常。

我阅读了很多例子(来自互联网和教科书),我还没有看到有人如下进行双重检查。

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

ModelState.IsValid

条件true model可能保证null不是WideString

我的假设在这里是否正确?我担心我会做一个定时炸弹的假设。

3 个答案:

答案 0 :(得分:3)

要回答你的问题,不,ModelState.IsValid不会检查你的模型是否为null,如果发生这种情况会抛出错误。

在API中,如果在构建请求模型时出错并且它与端点所期望的不匹配,则很容易使用空模型。

或者其他人可以查看您的网站,查看API调用,并决定使用不具备有效模型的请求获得一些乐趣并充斥您的API。

有一些方法可以在一个地方检查空模型,例如:ModelState is valid with null model

答案 1 :(得分: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; }

在这种情况下,如果你的LastName包含超过50个caracters,ModelState为false,因为vaueProvidedResult有异常

希望你对ModelState

有所了解

您的问题的答案是您可以处理来自modelState的模型

如果model null自动modelState无效

答案 2 :(得分:1)

答案是否定的。

ModelState表示尝试将已发布的表单(标有BeginForm)绑定到还包含验证信息的操作方法。它带有默认的模型绑定器设置,用于指定应将哪些验证设置包含在viewmodel中,例如: RequiredAttribute,以便对必填字段进行空值检查取决于存在哪些验证设置,而不是ModelStateDictionary本身。

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

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

因此,如果所有模型属性都设置为null / empty而未指定RequiredAttribute,则由于没有验证属性,ModelStateDictionary.IsValid值仍为true&amp;模型绑定有效。

类似问题:

ModelState.IsValid even when it should not be?