如何禁用服务器端验证 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
}