当json数据包含的内容多于OData控制器中定义的Post方法所需的属性时,我遇到了向OData控制器发布请求的问题。所谓的过度发布应该被允许用于MVC控制器,但似乎OData控制器不接受它。请查看以下示例。
我有一个简单的实体类:
public class Skill
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(100)]
public string Name { get; set; }
public SkillAffiliation ApplicableTo { get; set; }
}
一个带Post方法的简单OData控制器,如下所示:
public IHttpActionResult Post(Skill skill)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_dbContext.Skills.Add(skill);
_dbContext.SaveChanges();
return Created(skill);
}
问题是我使用第三方Web控件集合,而应该使用我的OData控制器的控件添加了一个额外的json属性,基本上POST请求如下所示:
{"名称":" TEST2"" ApplicableTo":"车载"" ApplicableTo_input":& #34;车载"}
因此有一个额外的ApplicableTo_input属性 - 这不幸导致模型验证错误。 ModelState.IsValid属性设置为false,并且出现错误消息"属性' ApplicableTo_input'在类型' Mango.Models.Skill'中不存在。确保仅使用由类型定义的属性名称。"添加这个额外的属性显然是他们的解决方案中的一个错误,并将在下一个版本中修复,但是在那个时候到来之前我必须找到一些解决方法。
我已经尝试将[Bind(Exclude =" ApplicableTo_input")]属性添加到我的帖子操作参数中,但它似乎无法正常工作。有什么想法吗?
答案 0 :(得分:0)
通过添加字典属性使SkillWrapper成为一个开放的实体。
public class SkillWrapper
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(100)]
public string Name { get; set; }
public SkillAffiliation ApplicableTo { get; set; }
public IDictionary<string, object> CustomerProperties { get; set; }
}
使用技能存储值并保存在数据库中。
public IHttpActionResult Post(SkillWrapper skill)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var value = new Skill();
...//get property value form skill
_dbContext.Skills.Add(value);
_dbContext.SaveChanges();
return Created(value);
}