为什么BindNever属性不起作用

时间:2016-10-07 16:38:56

标签: c# asp.net-core asp.net-core-mvc model-binding

我不想在我的Id上绑定CustomerViewModel属性,所以我添加了[BindNever]属性,但它无效。可能是什么解决方案?

我有以下内容:

CustomerController.cs

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

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; }
}

如果我输入以下json。 id属性仍会绑定

{
  "id": 100,
  "lastName": "Bruce",
  "firstName": "Wayne",
  "email": "bruce@gothamcity.com"
}

2 个答案:

答案 0 :(得分:9)

Blog post是一个有趣的读物,并得出结论:[FromBody]注释“覆盖”BindBehaviourAttributeBindNever是一个简单的专业化)。该模型由正文中可用的所有数据填充(在本例中为您的JSON数据)。

我不认为这是直观的,issue对此有一个很好的陈述:

  

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

     

[FromBody]将受影响的属性或参数切换为   输入格式的不同世界。每个输入格式器(例如   可以认为Json.NET和一个小的MVC特定的包装器   单独的系统与自己的定制。模型绑定系统   不知道JSON(或任何其他)反序列化的细节。

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

有什么替代方案?

解决方案1:编写一些自定义模型绑定代码。我自己没有这样做,但What is the correct way to create custom model binders in MVC6?可能有所帮助。

解决方案2:相当务实的

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

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

答案 1 :(得分:0)

尝试使用NotMapped属性。

正文必须至少包含30个字符;您输入了24。