我不想在我的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"
}
答案 0 :(得分:9)
此Blog post是一个有趣的读物,并得出结论:[FromBody]
注释“覆盖”BindBehaviourAttribute
(BindNever
是一个简单的专业化)。该模型由正文中可用的所有数据填充(在本例中为您的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。