使用WebAPI时重新验证模型(TryValidateModel等效)

Mar*_*ark 6 asp.net asp.net-mvc asp.net-web-api

使用vanilla MVC,我可以使用TryValidateModel重新验证我的模型.TryValidateModel方法似乎不适用于WebAPI.如何在使用WebAPI时重新验证我的模型?

rik*_*len 10

我知道已经有一段时间了,但是这个问题仍然有效.因此,我认为我应该分享我对这个问题的解决方案.我决定自己实现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;
    }
Run Code Online (Sandbox Code Playgroud)


hex*_*hex 5

我不知道它什么时候添加,但现在api控制器上有Validate方法.

ApiController.Validate方法(TEntity) https://msdn.microsoft.com/en-us/library/dn573258%28v=vs.118%29.aspx


Mar*_*ark 1

结果 WebAPI 不支持 TryValidateModel。CodePlex 上有一个功能请求。