APN.NET WebAPI OData控制器 - 发布参数绑定

时间:2015-04-15 11:38:22

标签: asp.net-web-api odata asp.net-web-api-odata

当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; }
}
  • SkillAffiliation是一个枚举。

一个带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")]属性添加到我的帖子操作参数中,但它似乎无法正常工作。有什么想法吗?

1 个答案:

答案 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);
}