孤行者程序之路 2024-05-08 00:46 采纳率: 50%
浏览 5

Asp.net Mvc,在控制器的Action参数上用数据注解校验无效

#问题简略介绍
Asp.net mvc在控制器Action的参数上做校验无效

#问题详细介绍
我使用Asp.net Mvc在控制器的方法的参数上打了一些数据注解,目的是对提交的参数进行数据校验,但是,无论是我用接口工具测试还是调试ModelState的IsValid属性始终为True,也就是校验通过。尽管我的数据不符合我的数据注解。后面我甚至法一个空的{}对象到接口,也是验证通过。仿佛数据注解打在Action参数上完全无效。

#我的代码如下

public JsonResult GetAuth([Required][StringLength(50, ErrorMessage = "字符长度应在6-50之间", MinimumLength = 6)] string token)
        {
            string msg = null;
            if(ModelState.IsValid)
            {
                msg = "正确";
            }
            else
            {
                msg = "错误";
            }

            return Json(new Res() {code=20000,msg= msg });
        }

用以上代码,我无论提交什么,ModelState.IsValid始终为True。

但是,如果我在Model层建立一个类,类里面封装一个Token字段,在Token字段上打注解,然后再把这个类作为以上GetAuth方法的参数,验证又完全正常了。

类的代码如下:

public class TestModel
    {
        [Required]
        [StringLength(50, ErrorMessage = "字符长度应在6-50之间", MinimumLength = 6)]
        public string Token { get; set; }
    }

用TestModel类把参数进行封装后Action部分的代码如下:

public JsonResult GetAuth(TestModel testModel)
        {
            string msg = null;
            if(ModelState.IsValid)
            {
                msg = "正确";
            }
            else
            {
                msg = "错误";
            }

            return Json(new Res() {code=20000,msg= msg });
        }

我就是想问,难道不可以在Action上打注解来实现接口的参数校验吗?因为一个项目接口太多,我总不可能为每个接口都建立一个专门的类作为Action的入参。请问这个问题应该怎么解决,为什么不能在Action上打注解,还是我什么步骤没有做到位。

顺便提一句,web.config里面这两个关于校验的配置项我也加了:

<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>

顺便问一下各位大虾,你们是怎么做数据校验的

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-08 00:46
    关注

    引自免费微信小程序:皆我百晓生

    针对你在 ASP.NET MVC 中遇到的问题,首先确认一下,确保你已经正确地引入了 Microsoft.DataAnnotations 命名空间,并且你的模型绑定器正在生效。如果你已经在 Web.config 中启用了客户端验证和非侵入式 JavaScript 验证,那么可能的原因是模型绑定器没有正确处理 Action 参数上的 DataAnnotations。在这种情况下,可以尝试手动启用模型绑定器。

    以下是你可以尝试的几个步骤来解决问题:

    1. 确保已导入命名空间:
    using System.ComponentModel.DataAnnotations;
    
    1. 在 Global.asax.cs 或 Startup.cs(对于 MVC 5 以后版本)中注册模型绑定器:
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    
        // 注册模型绑定器
        ModelBinders.Binders.DefaultBinder = new DefaultModelBinder(); // MVC 5 及之前版本
        // 或者
        services.AddControllersWithViews().AddMvcOptions(options => options.ModelBinderProviders.Insert(0, new BinderProviderOptions { BinderType = typeof(DefaultModelBinder) })); // MVC Core
    }
    
    1. 如果你是在 MVC Core 中,你还需要确保在 Startup.cs 的 ConfigureServices 方法中添加以下代码:
    services.AddControllersWithViews().AddNewtonsoftJson();
    
    1. 保持你的 appSettings 配置正确:
    <appSettings>
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    </appSettings>
    
    1. 使用 [Bind(Prefix = "")] 标签来明确指定模型绑定器应该从哪里获取值。这有时可以帮助解决一些模型绑定问题:
    [HttpGet]
    public JsonResult GetAuth([Bind(Prefix = "")][Required][StringLength(50, ErrorMessage = "字符长度应在6-50之间", MinimumLength = 6)] string token)
    {
        string msg = null;
        if (ModelState.IsValid)
        {
            msg = "正确";
        }
        else
        {
            msg = "错误";
        }
    
        return Json(new Res() { code = 20000, msg = msg });
    }
    

    按照这些步骤操作后,你应该能在 Action 参数上使用 DataAnnotations 进行有效校验。如果仍然存在问题,可能是其他配置或框架行为导致的,这时你需要检查整个请求生命周期中的其他环节是否有异常。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月8日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中