假设我们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
不是WideString
。
我的假设在这里是否正确?我担心我会做一个定时炸弹的假设。
答案 0 :(得分:3)
要回答你的问题,不,ModelState.IsValid不会检查你的模型是否为null,如果发生这种情况会抛出错误。
在API中,如果在构建请求模型时出错并且它与端点所期望的不匹配,则很容易使用空模型。
或者其他人可以查看您的网站,查看API调用,并决定使用不具备有效模型的请求获得一些乐趣并充斥您的API。
有一些方法可以在一个地方检查空模型,例如:ModelState is valid with null model
答案 1 :(得分:1)
什么是模型状态? ModelState表示在POST期间提交给服务器的名称和值对的集合
ModelState中有什么? 以下是这些值在同一调试器会话中的外观: 每个属性都有一个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;模型绑定有效。
类似问题: