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 關注
- 191 瀏覽
添加回答
舉報