亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

WebApi:ID 之間不匹配

WebApi:ID 之間不匹配

C#
臨摹微笑 2023-08-13 09:22:13
鑒于以下路線/api/Person/15我們用 body 對這條路由執行 PUT 操作:{    id: 8,    name: 'Joosh'}路線段值為 ,15但[FromBody]id 為8?,F在我們的控制器中有如下內容: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 關注
  • 191 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號