ASP.NET 核心自定义验证属性未触发
ASP.NET Core Custom Validation Attribute Not Firing
我在 API 控制器中有一个 GET 方法。我希望使用自定义验证属性验证该方法,如下所示。但是由于某些原因它没有被解雇。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class CheckValidRoute : ValidationAttribute
{
private readonly string _apiRoute;
private readonly string _operation;
public override bool RequiresValidationContext { get { return true; } }
public CheckValidRoute(string apiRoute, string operation)
{
_apiRoute = apiRoute;
_operation = operation;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//Validation logic here
}
}
控制器
public class TestController : ControllerBase
{
[HttpGet("production/{movieId}/Test")]
[ProducesResponseType(typeof(ResponseModel<string>), 200)]
[Authorize(Policy = SecurityConstants.PseudofilmAuthorizationPolicy)]
[CheckValidRoute("production/{movieId}/Test", "GET")]
public async Task<ResponseModel<string>> TestGet(long movieId)
{
return ResponseModelHelper.BuildResponse("Success", $"production/{movieId}/Test", "Test");
}
}
我不确定我在这里遗漏了什么。
-艾伦-
您使用错误的基础 class 来实现您的属性。
ValidationAttribute
用于 Models
以验证其 属性 值。 Required
属性就是一个例子。
在您的情况下,您想要实现一个 ActionFilter
,它可以应用于控制器方法并可以在调用该方法之前执行验证。举个例子:
public class CheckValidRouteAttribute : ActionFilterAttribute
{
private readonly string _apiRoute;
private readonly string _operation;
public CheckValidRouteAttribute(string apiRoute, string operation) : base()
{
_apiRoute = apiRoute;
_operation = operation;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.HttpContext.Request;
var method = request.Method;
if (string.Compare(method, _operation, true) != 0)
{
context.Result = new BadRequestObjectResult("HttpMethod did not match");
}
}
}
在 OnActionExecuting
方法中,您可以对 HttpContext.Request
对象执行检查。我把它留给你作为练习,因为我不知道你的确切要求:-)
将此属性应用到您的控制器方法后,将在调用控制器方法之前调用 OnActionExecuting
,以便您进行验证。
您可以阅读有关 ActionFilters 的更多信息here
我在 API 控制器中有一个 GET 方法。我希望使用自定义验证属性验证该方法,如下所示。但是由于某些原因它没有被解雇。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class CheckValidRoute : ValidationAttribute
{
private readonly string _apiRoute;
private readonly string _operation;
public override bool RequiresValidationContext { get { return true; } }
public CheckValidRoute(string apiRoute, string operation)
{
_apiRoute = apiRoute;
_operation = operation;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//Validation logic here
}
}
控制器
public class TestController : ControllerBase
{
[HttpGet("production/{movieId}/Test")]
[ProducesResponseType(typeof(ResponseModel<string>), 200)]
[Authorize(Policy = SecurityConstants.PseudofilmAuthorizationPolicy)]
[CheckValidRoute("production/{movieId}/Test", "GET")]
public async Task<ResponseModel<string>> TestGet(long movieId)
{
return ResponseModelHelper.BuildResponse("Success", $"production/{movieId}/Test", "Test");
}
}
我不确定我在这里遗漏了什么。
-艾伦-
您使用错误的基础 class 来实现您的属性。
ValidationAttribute
用于 Models
以验证其 属性 值。 Required
属性就是一个例子。
在您的情况下,您想要实现一个 ActionFilter
,它可以应用于控制器方法并可以在调用该方法之前执行验证。举个例子:
public class CheckValidRouteAttribute : ActionFilterAttribute
{
private readonly string _apiRoute;
private readonly string _operation;
public CheckValidRouteAttribute(string apiRoute, string operation) : base()
{
_apiRoute = apiRoute;
_operation = operation;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var request = context.HttpContext.Request;
var method = request.Method;
if (string.Compare(method, _operation, true) != 0)
{
context.Result = new BadRequestObjectResult("HttpMethod did not match");
}
}
}
在 OnActionExecuting
方法中,您可以对 HttpContext.Request
对象执行检查。我把它留给你作为练习,因为我不知道你的确切要求:-)
将此属性应用到您的控制器方法后,将在调用控制器方法之前调用 OnActionExecuting
,以便您进行验证。
您可以阅读有关 ActionFilters 的更多信息here