如何禁用服务器端验证 mvc Web API 控制器



如何禁用服务器端验证 mvc Web API 控制器。 请告诉我使用自定义验证的简单方法。

来自@peco的答案只会清除验证,但验证仍然运行。

要禁用控制器的验证,您可以使用自定义IControllerConfiguration属性清除特定控制器的ModelValidatorProvider

public class DisableModelValidatorAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings settings,
        HttpControllerDescriptor descriptor)
    {
        settings.Services.Clear(typeof(ModelValidatorProvider));
    } 
}

只需将属性应用于控制器:

[DisableModelValidator]
public class SomeController : ApiController
{
    public IHttpActionResult Post(MyDto dto)
    {
        // ModelState.IsValid is always true now
        return Ok();
    }
}

另请参阅:https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/configuring-aspnet-web-api并在 WebAPI

尝试使用

[ValidateInput(false)]

使用操作方法

Web api 没有会禁用验证的ValidateInput属性,但您可以轻松定义一个将重置ModelState的属性:

public class ValidateInput : ActionFilterAttribute
{
    private readonly bool _enableValidation;
    public ValidateInput(bool enableValidation)
    {
        _enableValidation = enableValidation;
    }
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if(_enableValidation)
        {
            return;
        }
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.ModelState.Clear();
        }
    }
}

然后在控制器中使用它:

public class SomeController : ApiController
{
    [ValidateInput(false)]
    public IHttpActionResult Post(MyDto dto)
    {
        // ModelState.IsValid is always true now
        return Ok();
    }
}
public class MyDto
{
    [Required]
    public int Id { get; set; }
}

除了@peco很好的答案之外,如果您需要从ModelState中删除特定键,此属性还会有所帮助:

public class ExceptPropertiesAttribute : ActionFilterAttribute
{
    private IEnumerable<string> _propertiesKeys;
    public ExceptPropertiesAttribute(string commaSeperatedPropertiesKeys)
    {
        if (!string.IsNullOrEmpty(commaSeperatedPropertiesKeys))
        {
            this._propertiesKeys = commaSeperatedPropertiesKeys.Split(',');
        }
    }
    public override void OnActionExecuting(ActionExecutingContext actionContext)
    {
        if (this._propertiesKeys != null)
        {
            foreach (var propertyKey in this._propertiesKeys)
            {
                if (actionContext.ModelState.ContainsKey(propertyKey))
                {
                    actionContext.ModelState.Remove(propertyKey);
                }
            }                
        }
    }
}

此外,在.Net Core中,我可以使用ActionExecutingContext而不是HttpActionContext

用法:

[ExceptProperties("Id,Name")]
public ActionResult Post([FromBody] MyModelDTO itemDTO)
{
    //code
}
public ActionResult Put([FromBody] MyModelDTO itemDTO)
{
    //code
}

最新更新