为什么BindNever属性不起作用

bma*_*man 7 c# model-binding asp.net-core-mvc asp.net-core

我不想Id在我的上绑定属性CustomerViewModel所以我添加了一个[BindNever]属性,但它不起作用.可能是什么解决方案?

我有以下内容:

CustomerController.cs

// PUT api/customers/5
[HttpPut("{id}")]
public async Task<IActionResult> Put([FromUri] int id, [FromBody]CustomerViewModel customer)
{
  //Implementation
}
Run Code Online (Sandbox Code Playgroud)

CustomerViewModel

public class CustomerViewModel
{
    [BindNever]
    public int Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我输入以下json.该id物业仍然被绑定

{
  "id": 100,
  "lastName": "Bruce",
  "firstName": "Wayne",
  "email": "bruce@gothamcity.com"
}
Run Code Online (Sandbox Code Playgroud)

Ral*_*ing 10

这篇博客文章是一个有趣的读物,并得出结论,[FromBody]注释"覆盖" BindBehaviourAttribute(BindNever是一个简单的专业化).该模型由正文中可用的所有数据填充(在本例中为您的JSON数据).

我不认为这是直观的,这个问题有一个很好的说法:

[BindRequired]自定义MVC模型绑定系统.这是它的目的,它按设计工作.

[FromBody]将受影响的属性或参数切换到输入格式的不同世界.每个输入格式化程序(例如Json.NET和一个小的MVC特定包装器)都可以被视为具有自己的自定义的独立系统.模型绑定系统不了解JSON(或任何其他)反序列化的细节.

获得的经验:BindNever在这种情况下不起作用.

什么是替代品?

解决方案1:编写一些自定义模型绑定代码.我自己没有这样做,但在MVC6中创建自定义模型绑定器的正确方法是什么?可能有帮助.

解决方案2:相当务实的一个

也许这个简单(但不是很好)的解决方法可以帮助你:

[HttpPut("{id}")]
public async Task<IActionResult> Put([FromUri] int id, [FromBody]CustomerViewModel customer)
{
    customer.Id = 0;
    //Implementation
}
Run Code Online (Sandbox Code Playgroud)

  • 拥有一个私人二传手似乎可以解决问题。我无法验证我的解决方案。我试图环顾四周寻找类似的东西,但没有运气。 (2认同)