2

当 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 是一个枚举。

还有一个简单的 OData 控制器,带有 Post 方法,如下所示:

public IHttpActionResult Post(Skill skill)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    _dbContext.Skills.Add(skill);
    _dbContext.SaveChanges();

    return Created(skill);
}

问题是我使用了第三方 Web 控件集合,并且应该使用我的 OData 控制器的控件添加了一个额外的 json 属性,基本上 POST 请求如下所示:

{"Name":"TEST2","ApplicableTo":"Vehicle","ApplicableTo_input":"Vehicle"}

所以有一个额外的 ApplicableTo_input 属性——不幸的是,这会导致模型验证错误。ModelState.IsValid 属性设置为 false,并且出现错误消息“类型 'Mango.Models.Skill' 上不存在属性 'ApplicableTo_input'。确保仅使用类型定义的属性名称。” 添加这个额外的属性显然是他们解决方案中的一个错误,并将在下一个版本中修复,但是在那之前我必须找到一些解决方法。

我已经尝试将 [Bind(Exclude="ApplicableTo_input")] 属性添加到我的发布操作参数中,但它似乎不起作用。有任何想法吗?

4

1 回答 1

1

通过添加字典属性使 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);
}
于 2015-04-21T05:10:18.970 回答