3 回答
TA贡献2051条经验 获得超10个赞
您可以通过自定义模型验证来实现
[HttpPut("api/Person/{id}")]
public IActionResult Put(string id, [FromBody]Person person)
{
// ... Do normal stuff
return Ok();
}
public class Person
{
[ValidateId]
public string Id { get; set; }
public string Name { get; set; }
}
public sealed class ValidateId : ValidationAttribute
{
protected override ValidationResult IsValid(object id, ValidationContext validationContext)
{
var httpContextAccessor = (IHttpContextAccessor)validationContext.GetService(typeof(IHttpContextAccessor));
var routeData = httpContextAccessor.HttpContext.GetRouteData();
var idFromUrl = routeData.Values["id"];
if (id.Equals(idFromUrl))
{
return ValidationResult.Success;
}
else
{
return new ValidationResult("Id mismatch!");
}
}
}
// In the Startup class add the IHttpContextAccessor
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddHttpContextAccessor();
// ...
}
TA贡献1772条经验 获得超6个赞
是否有一个“默认”或干燥的方法来执行此操作,而不假设它总是像参数 ID 和 Model.Id 属性一样简单?
自定义验证逻辑可以在 ActionFilter 中实现。由于 ActionFilter 是在操作执行中的模型绑定之后进行处理的,因此可以在 ActionFilter 中使用模型和操作参数,而无需从请求正文或 URL 中读取。您可以参考下面的工作演示:
自定义验证过滤器
public class ValidationFilter: ActionFilterAttribute
{
private readonly ILogger _logger;
public ValidationFilter(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("ValidatePayloadTypeFilter");
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var carDto = context.ActionArguments["car"] as Car;
var id = context.ActionArguments["id"];
if (Convert.ToInt32(id)!=carDto.Id)
{
context.HttpContext.Response.StatusCode = 400;
context.Result = new ContentResult()
{
Content = "Id mismatch!"
};
return;
}
base.OnActionExecuting(context);
}
}
在ConfigureServices方法中注册此操作过滤器
services.AddScoped<ValidationFilter>();
将此操作过滤器称为服务
public class Car
{
public int Id { get; set; }
public string CarName { get; set; }
}
[ServiceFilter(typeof(ValidationFilter))]
[HttpPut("{id}")]
public Car Put(int id, [FromBody] Car car)
{
// the stuff you want
}
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报