.net Mvc验证的坑

本文探讨了在ASP.NET MVC中使用内置验证机制的过程。通过一个具体的案例,详细解释了如何定义模型及其验证属性,以及如何在控制器中利用ModelState来检查验证状态。特别关注了不同类型字段(如必填字段和可空字段)的处理方式。
摘要由CSDN通过智能技术生成

在.net Mvc开发时我们一般都会选择自带的验证机制。

我们定义一个model

 public class ContainerModel {
            
        [Display(Name = "流水号")]
    	public long Id { get; set; }
        
        [Display(Name = "委托业务流水号")]
        [Required(ErrorMessage = "委托业务流水号不能为空")]
        public long ConsignId { get; set; }

        [Display(Name = "所属人")]
    	public long? OwnerId { get; set; }
}    

控制器,用ModelState.IsValid进行验证,ExpendErrors是一个拓展方法,获取验证失败的字段

 public ActionResult Create(ContainerModel model)
        {
                if (ModelState.IsValid) {
                    //...
                } else {
                    log.Warn("失败,数据不完整-" + this.ExpendErrors());
                    return Json(...);
                }
            }
        }            

我们都知道,当从前端页面传入参数时,ConsignId字段是必须传的,但是 Id和OwnerId呢?

OwnerId是可空类型,前端当然可以不传参数,或者传一个空值的参数也可以,验证通过。

Id是不可空int类型,我们可以测试一下:

$.ajax({
            type: "Post",
            url: "Create",
            data: {
                Id:0,
                ConsignId:10,
                OwnerId:1,
            },
            success: function (result) {
            }
        }, "json");

OK,验证通过

$.ajax({
            type: "Post",
            url: "Create",
            data: {
                ConsignId:10,
                OwnerId:1,
            },
            success: function (result) {
            }
        }, "json");

OK,验证也通过

$.ajax({
            type: "Post",
            url: "Create",
            data: {
                Id:,
                ConsignId:10,
                OwnerId:1,
            },
            success: function (result) {
            }
        }, "json");

这时候就不能通过了,监控ExpendErrors得到Id字段是必须的,断点到控制器Create方法,看到传过来的Model.Id=0也是有值的,这就奇怪了,明明有值的,也没设置Required验证,为什么就通不过了呢?

原来,是我没有理解验证机制的原理,验证机制是发生在前端参数转化为后端model属性时候发生的,也就是执行目标Action方法之前,model的Id为不可空的Int类型,而参数传递了一个空值,所以验证不同过。解决办法就是:要么不传该参数,要传就传有初始化值的参数。

 

转载于:https://www.cnblogs.com/albert-xiong/p/7602345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值