Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用自定义模型绑定器不触发Web验证

使用自定义模型绑定器不触发Web验证
EN

Stack Overflow用户
提问于 2016-12-04 23:05:51
回答 2查看 1.8K关注 0票数 6

我正在使用Web 5构建Web,我通过扩展IModelBinder接口来将复杂类型映射为要操作的参数,从而实现自定义模型绑定。装订部份运作良好。但是模型验证没有发生。ModelState.IsValid总是正确的。

代码语言:javascript
运行
AI代码解释
复制
public class PagingParamsVM
{
        [Range(1, Int32.MaxValue, ErrorMessage = "Page must be at least 1")]
        public int? Page { get; set; }

        [Range(1, Int32.MaxValue, ErrorMessage = "Page size must be at least 1")]
        public int? PageSize { get; set; }
}

public class PaginationModelBinder : IModelBinder
{
        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
              var model = (PagingParamsVM)bindingContext.Model ?? new PagingParamsVM();
              //model population logic
              .....

              bindingContext.Model = model;
              return true;
        }
}

public IEnumerable<NewsItemVM> Get([ModelBinder(typeof(PaginationModelBinder))]PagingParamsVM pegination)
{
            //Validate(pegination); //if I call this explicitly ModelState.IsValid is set correctly.
            var valid = ModelState.IsValid; //this is always true
}

public class ModelStateValidationActionFilter : ActionFilterAttribute
{
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var valid = actionContext.ModelState.IsValid //this is always true.
        }
}

如果我显式调用Validate()或使用FromUri属性,则ModelState.IsValid将被正确设置。

代码语言:javascript
运行
AI代码解释
复制
public IEnumerable<NewsItemVM> Get([FromUri]PagingParamsVM pegination)
{
            var valid = ModelState.IsValid;
}

应该在模型活页夹内实现验证部分。如果是这样的话,我应该如何实现?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-05 03:55:30

我找到了答案。可以在自定义模型绑定器中调用默认验证过程,如下所示,

代码语言:javascript
运行
AI代码解释
复制
public abstract class PaginationModelBinder : IModelBinder
{
        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
              var model = (PagingParamsVM)bindingContext.Model ?? new PagingParamsVM();
              //model population logic
              .....

              bindingContext.Model = model;

              //following lines invoke default validation on model
              bindingContext.ValidationNode.ValidateAllProperties = true;
              bindingContext.ValidationNode.Validate(actionContext);

              return true;
        }
}

谢谢你们的支持。

票数 3
EN

Stack Overflow用户

发布于 2016-12-04 23:47:01

DefaultModelBinder.CreateModel应该帮助您保持模型状态:

代码语言:javascript
运行
AI代码解释
复制
public class PaginationModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        if(modelType == typeof(PagingParamsVM))
        {
            var page = default(int?);
            var model = bindingContext.Model;
            var valueProvider = bindingContext.ValueProvider;
            var pageValue = valueProvider.GetValue("Page");
            var tmp = default(int);
            if(pageValue != null && int.TryParse(pageValue.AttemptedValue, out tmp))
            {
                page = tmp;
            }

            var pageSize = default(int?);
            var sizeValue = valueProvider.GetValue("PageSize");
            if(sizeValue != null && int.TryParse(sizeValue.AttemptedValue, out tmp))
            {
                pageSize = tmp;
            }
            return new PagingParamsVM { Page = page, PageSize = pageSize };
        }
        return base.CreateModel(controllerContext, bindingContext, modelType);
    }
}

使用绑定程序的web api控制器可以是:

代码语言:javascript
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;

public class NewsItemController : ApiController
{
    public IEnumerable<NewsItemVM> Get([ModelBinder(typeof(PaginationModelBinder))]PagingParamsVM pegination)
    {
        //Validate(pegination); //if I call this explicitly ModelState.IsValid is set correctly.
        var valid = ModelState.IsValid; //this is always true
        return Enumerable.Empty<NewsItemVM>();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40968811

复制
相关文章
ASP.NET Web API编程——模型验证与绑定
1.模型验证 使用特性约束模型属性 可以使用System.ComponentModel.DataAnnotations提供的特性来限制模型。 例如,Required特性表示字段值不能为空,Range特性限制数值类型的范围。 对实体类使用特性后,可以使用ModelState.IsValid来判断验证是否通过。 例: 实体: public class DataModel { public int Id { get; set; } public string Field1Nam
甜橙很酸
2018/04/18
3K0
ASP.NET Web API编程——模型验证与绑定
SQL基础【十九、触发器】(不建议使用触发器的原因)
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
红目香薰
2022/11/28
1.2K0
【asp.net core】自定义模型绑定及其验证
    水此篇博客,依旧是来自群里的讨论,最后说到了,在方法参数自定义了一个特性,用来绑定模型,优先从Form取,如果为空,或者不存在,在从QueryString中获取并且绑定,然后闲着无聊,就水一篇博客,如果大家有什么需求或者问题,可以找我,很高兴能为你们带来帮助。
陈显达
2023/05/11
6150
go : gin 模型绑定与验证
将请求体绑定到类型中,请使用模型绑定。我们目前支持JSON、XML、YAML和标准表单值(foo=bar&boo=baz)的绑定
IT工作者
2022/07/23
3040
使用触发器
本章介绍如何在Intersystems SQL中定义触发器。触发器是响应某些SQL事件执行的代码行。本章包括以下主题:
用户7741497
2022/06/07
1.8K0
oracle怎么使用触发器,Oracle触发器的使用[通俗易懂]
触发器是指存放在数据库中,并被隐藏执行的存储过程。在Oracle8i之前,只允许基于表或视图的DML操作(insert,update,delete)建立触发器,在oracle8i之后,不仅支持DML操作,也允许基于系统事件(启动数据库,关闭数据库,登录)和DDL操作建立触发器。
全栈程序员站长
2022/09/14
2.5K0
ios touchesBegan不触发
今天简单写了一个touchesBegan,发现无法触发,点击无效,网上找了半天没有效果。 最终发现问题是uiimageview需要开启交互:
全栈程序员站长
2022/09/15
7090
ios touchesBegan不触发
asp.net core自定义模型验证——前端验证
转载请注明出处:http://www.cnblogs.com/zhiyong-ITNote/
Ryan_OVO
2023/10/19
2550
AngularJS 的输入验证机制:内置验证器、自定义验证器和显示验证信息
AngularJS 是一款流行的前端JavaScript框架,提供了强大的表单处理功能。其中一个关键特性是输入验证,即对用户输入进行验证以确保数据的有效性和完整性。本文将详细介绍 AngularJS 的输入验证机制,包括内置验证器、自定义验证器和显示验证信息等内容。
网络技术联盟站
2023/07/05
3960
24_自定义Model绑定器
http://mpvideo.qpic.cn/0b7834aagaaapman54wkuzpvbx6dappqaaya.f10002.mp4?dis_k=d9f02a2fbe21951c9cb86e9
宿春磊Charles
2022/03/29
1980
web服务器,验证码,Xftp使用方法
直接装的wamp 腾讯云主机控制台 安全组里可以配置要开放的端口 关闭防火墙
达达前端
2019/07/03
1K0
web服务器,验证码,Xftp使用方法
第77天:jQuery事件绑定触发
返回值不同,.height()方法返回的是 数字类型(20),.css(“height”)返回的是字符串类型(20px),因此.height()方法常用在参与数学计算的时候
半指温柔乐
2018/09/11
1.4K0
Spring Web@ControllerAdvice 配合 @InitBinder 自定义参数绑定
不是所有的参数,spring web都可以帮你绑定的,比如说日期Date类型。就会报错IllegalStateException错误:
MickyInvQ
2021/06/22
4520
Spring Web@ControllerAdvice 配合 @InitBinder 自定义参数绑定
JQuery 事件绑定不生效
一个同时问我,JQuery事件绑定为什么不生效,最好通过查找,发现了问题。 一般而言,JQuery事件绑定不生效,是一些新手经常遇到的问题,其实都是简单的问题,大概分两种情况。 先上代码,以下两个button的事件绑定都不生效。
用户3158888
2019/05/29
2.7K0
MySQL中触发器的使用
如遇到触发器报错“Not allowed to return a result set from a trigger”;请划到最后看详解;
xbhog
2020/12/10
3.4K0
JavaScript 技术篇-js代码触发dom元素绑定事件实例演示,jquery触发元素绑定事件方法
jquery 通过 trigger() 方法触发点击事件。 $("#login_div > div > div.login-content > div.content-right > div > div > div.login-panel-input.login-submit-panel > button").trigger("click")
小蓝枣
2021/12/01
9.2K0
JavaScript 技术篇-js代码触发dom元素绑定事件实例演示,jquery触发元素绑定事件方法
ORACLE触发器(trigger)的使用
触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用
全栈程序员站长
2022/09/13
1.1K0
ORACLE触发器(trigger)的使用
SQLite---使用触发器(Trigger)
当数据库中的数据太多时,往往需要进行清理,将一些过时的数据删除,但是往往找不到合适的时机进行清理。于是SQLite提供了Trigger,当某些事件发生时,可以触发并且进行处理。
None_Ling
2018/12/06
2.5K0
如何在Nginx不绑定域名下使用SSL/TLS证书?
该文主要记录如何在没有购买域名的情况下使用SSL/TLS协议,即地址前面的http变成了https。但是这样的SSL协议是会被浏览器认为是不安全的。在开发或者测试环境可以这样搞,生产环境下还是乖乖的买个域名吧。
Johnson木木
2021/01/05
4K0
点击加载更多

相似问题

自定义模型绑定器不验证模型

33

自定义模型绑定器未触发

10

Web模型绑定不绑定列表

14

路由模型绑定不触发

26

如何绑定模型属性(从控制器)而不立即触发验证?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档