3 回答
TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
您可以通過(guò)自定義模型驗(yàn)證來(lái)實(shí)現(xiàn)
[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貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
是否有一個(gè)“默認(rèn)”或干燥的方法來(lái)執(zhí)行此操作,而不假設(shè)它總是像參數(shù) ID 和 Model.Id 屬性一樣簡(jiǎn)單?
自定義驗(yàn)證邏輯可以在 ActionFilter 中實(shí)現(xiàn)。由于 ActionFilter 是在操作執(zhí)行中的模型綁定之后進(jìn)行處理的,因此可以在 ActionFilter 中使用模型和操作參數(shù),而無(wú)需從請(qǐng)求正文或 URL 中讀取。您可以參考下面的工作演示:
自定義驗(yàn)證過(guò)濾器
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方法中注冊(cè)此操作過(guò)濾器
services.AddScoped<ValidationFilter>();
將此操作過(guò)濾器稱為服務(wù)
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
}
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以創(chuàng)建自己的 CustomValidation 并比較 id 和 model.id 的值。
- 3 回答
- 0 關(guān)注
- 242 瀏覽
添加回答
舉報(bào)
