Asp.net core mvc 绑定批注不阻止套印

Asp.net core mvc 绑定批注不阻止套印,asp.net-core-mvc,Asp.net Core Mvc,我正试图防止我的一个保存函数中出现过多的内容。我正在使用绑定注释,但它似乎不起作用。可能是因为我使用了FromBody和Bind。这是我们第一次尝试做白名单过度保护,我们只是在组织上设置标准,所以即使是其他想法也可以 [HttpPost, HttpPut] [Route("/Claim/Save")] public async Task<EntitiesCorporation.Model.Claim> Save([FromBody, Bind( nameof(EntitiesCo

我正试图防止我的一个保存函数中出现过多的内容。我正在使用绑定注释,但它似乎不起作用。可能是因为我使用了
FromBody
Bind
。这是我们第一次尝试做白名单过度保护,我们只是在组织上设置标准,所以即使是其他想法也可以

[HttpPost, HttpPut]
[Route("/Claim/Save")]
public async Task<EntitiesCorporation.Model.Claim> Save([FromBody, Bind(
  nameof(EntitiesCorporation.Model.Claim.WarrantyId),
  nameof(EntitiesCorporation.Model.Claim.ClaimId)
)] EntitiesCorporation.Model.Claim claim) => 
    await _claimService.SaveClaim(claim, await _userService.GetCurrentUserRecordFromDatabase()); //here ClaimAmount is being honoured and I don't want it to be
[HttpPost,HttpPut]
[路由(“/Claim/Save”)]
公共异步任务保存([FromBody,Bind(
名称(实体公司.型号.索赔.保修ID),
名称(EntitiesCorporation.Model.Claim.ClaimId)
)]EntitiesCorporation.Model.Claim)=>
await _claimService.SaveClaim(claim,await _userService.GetCurrentUserRecordFromDatabase())//这是我的荣幸,我不想这样
下面是我编写的测试,它失败了,因为它断言索赔金额没有改变:

[Theory]
[InlineData(1, 34464, "/Claim/Save")]
public async Task Save_Claim_Ignores_Overposting(int warrantyId, int claimAmount, string url)
{
    var claim = new EntitiesCorporation.Model.Claim()
    {
        WarrantyId = warrantyId,
    };

    var content = JsonConvert.SerializeObject(new { WarrantyId = warrantyId, ClaimAmount = claimAmount });


    var response = await _client.PostAsync(url, new StringContent(content, Encoding.UTF8, "application/json"));
    response.EnsureSuccessStatusCode();

    var claimResponse = JsonConvert.DeserializeObject<EntitiesCorporation.Model.Claim>(await response.Content.ReadAsStringAsync());
    Assert.True(claimResponse.ClaimAmount == 0); //Fails because ClaimAmount is now 34464.
}
[理论]
[InlineData(134464,“/Claim/Save”)]
公共异步任务保存\u声明\u忽略\u覆盖(int-warequireyid、int-claimermount、字符串url)
{
var claim=new EntitiesCorporation.Model.claim()
{
保证ID=保证ID,
};
var content=JsonConvert.SerializeObject(新的{wareyid=wareyid,claimermount=claimermount});
var response=wait_client.PostAsync(url,新的StringContent(content,Encoding.UTF8,“application/json”);
response.EnsureSuccessStatusCode();
var claimResponse=JsonConvert.DeserializeObject(wait response.Content.ReadAsStringAsync());
Assert.True(claimResponse.claimermount==0);//失败,因为claimermount现在是34464。
}

根据您提供的信息,看不出有任何原因导致此操作无法正常工作。但是,通常应避免使用
BindAttribute
。无论如何,它只适用于创建操作,即使如此,它也可能由于各种原因而失败。改用视图模型,它将始终有效。不想发布<代码>挂载吗?不要将其作为属性包含在视图模型中。完成。无论发生什么,它都不可能通过。此外,FWIW、API操作通常不应接受实体作为参数。这会将API与数据库层紧密耦合,这样您就无法独立地进行更改。例如,如果更改了实体上属性的名称,则会立即中断对API的任何调用。如果改用DTO,则可以将DTO中的值映射到新属性,客户端无需进行任何更改。