基于HTTP动词的WebAPI条件绑定

时间:2017-04-18 18:52:47

标签: asp.net-mvc asp.net-web-api model-binding

参加以下课程......

public class Person
{
    public long Id { get; set; }
    public long CaseID { get; set; }
    public string FirstName { get; set; }
}

以下Web API调用...

    public IHttpActionResult Put(long id, [FromBody] Person person)

对于PUT调用,我们希望模型绑定器忽略CaseID属性并仅对Id和FirstName进行水合。

我正在考虑使用自定义模型绑定器来解决此问题。所以模型绑定器应该拉动HTTP动词(在这种情况下是PUT),如果PUT只绑定Id和FirstName。对于其他动词绑定所有属性。

有没有办法使用默认的模型绑定器来引入这种类型的逻辑?

1 个答案:

答案 0 :(得分:2)

这就像用石头敲钉子一样。它可能会完成工作,但它不是正确的工具。您的模型应该是您期望的资源的表示。换句话说,如果您不想要CaseID,那么您的模型不应具有该属性。您可以通过简单的继承轻松解决这个问题。例如,您可以执行以下操作:

public class Person
{
    public long Id { get; set; }
    public string FirstName { get; set; }
}

public class PersonWithCaseID : Person
{
    public long CaseID { get; set; }
}

然后,当你不想要CaseID时,例如你的PUT方法:

public IHttpActionResult Put(long id, [FromBody] Person person)

当你这样做时:

public IHttpActionResult Post(long id, [FromBody] PersonWithCaseID person)

这更明确。它100%清楚您正在做什么,并且API仍然是自我记录的:您可以轻松地告诉Put不接受CaseID