加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 使用WebAPI时重新验证模型(TryValidateModel等效)

发布时间:2020-12-15 18:57:17 所属栏目:asp.Net 来源:网络整理
导读:使用vanilla MVC,我可以使用TryValidateModel重新验证我的模型. TryValidateModel方法似乎不适用于WebAPI.如何在使用WebAPI时重新验证我的模型? 解决方法 我知道已经有一段时间了,但是这个问题仍然有效.因此,我认为我应该分享我对这个问题的解决方案. 我决
使用vanilla MVC,我可以使用TryValidateModel重新验证我的模型. TryValidateModel方法似乎不适用于WebAPI.如何在使用WebAPI时重新验证我的模型?

解决方法

我知道已经有一段时间了,但是这个问题仍然有效.因此,我认为我应该分享我对这个问题的解决方案.
我决定自己实现TryValidateModel(对象模型),基于System.Web.Mvc.Controller.cs中的实现

问题是mvc的TryValidateModel内部使用了自己的HttpContext和ModelState.如果你去和两者相媲美,它们非常相似……

能够使用我们自己的HttpContext存在一个可以用于它的HttpContextWrapper.
由于我们必须清除模型状态,因此我们使用不同类型的ModelState并不重要,只要我们得到所需的结果,因此我从正确的类型创建一个新的ModelState对象……
我确实将错误添加到控制器的ModelState,而不是模型状态添加到新创建的ModelState,这似乎对我来说很好:)
这是我的代码,我刚添加到控制器…
别忘了导入图书馆……

using System.Web.ModelBinding;

    protected internal bool TryValidateModel(object model)
    {
        return TryValidateModel(model,null /* prefix */);
    }

    protected internal bool TryValidateModel(object model,string prefix)
    {
        if (model == null)
        {
            throw new ArgumentNullException("model");
        }

        ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => model,model.GetType());
        var t = new ModelBindingExecutionContext(new HttpContextWrapper(HttpContext.Current),new System.Web.ModelBinding.ModelStateDictionary());

        foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(metadata,t).Validate(null))
        {
            ModelState.AddModelError(validationResult.MemberName,validationResult.Message);
        }

        return ModelState.IsValid;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读