当前位置: 首页 > 知识库问答 >
问题:

无论必填字段中是否存在空值,ModelState始终被视为有效

仲高超
2023-03-14

我四处寻找了一下,我认为我的解决方案很好,但不知何故 属性始终是

请考虑以下代码段:

[Route("address")]
[HttpPut]
[ResponseType(typeof(UserViewModel))]
public IHttpActionResult UpdateAddress([FromBody] UpdateAdressValidationModel model)
{
   if (!ModelState.IsValid)
   {
       return BadRequest(ModelState);
   }
   // irrelevant code omitted
}

[TestMethod]
public void UpdateAddress_WithoutStreet_ReturnsHttpCode400()
{
    var userController = new UserController(new UserRepository(_context));
    var addressInfo = new UpdateAdressValidationModel
    {
        City = "Ghent",
    };

    var response = userController.UpdateAddress(addressInfo) as BadRequestResult;

    Assert.IsNotNull(response);
}

public class UpdateAdressValidationModel
{
    [Required]
    public string Street { get; set; }

    [Required]
    public int? Number { get; set; }

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

    [Required]
    public int? PostalCode { get; set; }

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

仍然给我一个有效的modelstate,尽管它清楚地显示了所需的属性是

我忽略了什么?

请注意,手动添加

Validator.ValidateObject(model, new ValidationContext(model));

方法的顶部,在 字段上抛出一个 ,因此它实际上可以验证模型。问题仍然是:为什么它不是自动的?

此外,这是不适用的,因为我的 不是

共有2个答案

葛俊
2023-03-14

执行路径中的任何内容都不会导致发生验证。这是作为模型绑定的一部分来完成的,当您手动创建模型实例时,您并不需要这样做。

潘嘉佑
2023-03-14

事实证明,这个答案的想法是对的,但解决方案并不是很合适。

验证发生在将发布的数据绑定到视图模型时。然后将视图模型传递到控制器中。您将跳过第1部分,直接将视图模型传递到控制器中。

这是正确的,但是建议的解决方案抛出ValidationException,而不是简单地将 属性设置为

幸运的是,有一个特定的方法可以做到这一点: 。通过将这些行添加到单元测试,它将 设置为无效,并且不引发异常。

userController.Configuration = new HttpConfiguration();
userController.Validate(addressInfo);
 类似资料:
  • 问题内容: 我尝试@Inject这样的字段(它是一个jar模块,在META-INF下存在空bean.xml): IDataProvider接口 数据提供者实现import javax.enterprise.context.ApplicationScoped; 我尝试注入DataProvider的类 如果我在Wildfly上运行此命令,则注入的dataProvider始终为null(DataCont

  • 问题内容: 有没有更简单的功能,像这样: 问题答案: 像这样:

  • 我想有一个简单的表单验证在国家下拉,当且仅当国家值等于美国或加拿大。 我的确认工作到目前为止,但它不依赖于美国或加拿大的选择。基本上,现在它将迫使你选择一个州,即使你选择的国家不是美国或加拿大。

  • 问题内容: 该测试程序连接到https服务器并获取一些内容。我已经在浏览器中使用curl检查了服务器,并且证书运行正常。如果我运行curl从服务器上获取数据,它会正确地抱怨证书未知,除非我使用 –cacert传递它,或者使用-k关闭安全性。 所以我遇到的问题是,尽管我认为我的客户应该进行证书身份验证,并且告诉它公共证书在哪里,但是它始终可以工作。如果我删除了ca:选项,以至于它不知道服务器上的证书

  • 我几天前开始学习C#,我有一个关于公共字符串的问题,我目前正在尝试编写一个程序来复制和替换文件进行练习,但我有一个关于公共字符串的问题,无论我如何尝试修改代码,我自己都无法解决,所以我来这里寻求帮助 我做错了什么? 代码如下:

  • 问题内容: 如果在Golang中取消编组时,如果在json中找不到字段,是否可能会产生错误?我在文档中找不到它。是否有任何标记指定所需的字段? 问题答案: 程序包中没有将字段设置为“必需”的标签。您要么必须编写自己的方法,要么对缺少的字段进行后期检查。 要检查缺少的字段,您将必须使用指针以区分缺失/空值和零值: 完整的工作示例: 操场