为了账号安全,请及时绑定邮箱和手机立即绑定

WebApi:ID 之间不匹配

WebApi:ID 之间不匹配

C#
临摹微笑 2023-08-13 09:22:13
鉴于以下路线/api/Person/15我们用 body 对这条路由执行 PUT 操作:{    id: 8,    name: 'Joosh'}路线段值为 ,15但[FromBody]id 为8。现在我们的控制器中有如下内容:public Model Put(string id, [FromBody] Model model){     if (id != model.Id)         throw new Exception("Id mismatch!");     // ... Do normal stuff}是否有一个“默认”或干燥的方法来执行此操作,而不假设它总是像参数 ID 和 Model.Id 属性一样简单?
查看完整描述

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();

    // ...

}


查看完整回答
反对 回复 2023-08-13
?
梦里花落0921

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

}


查看完整回答
反对 回复 2023-08-13
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以创建自己的 CustomValidation 并比较 id 和 model.id 的值。



查看完整回答
反对 回复 2023-08-13
  • 3 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信