基于 HTTP 谓词的 WebAPI 条件绑定

WebAPI conditional binding based on HTTP verb

采取以下class...

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。对于其他动词绑定所有属性。

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

这就像用石头敲钉子一样。它可能会完成工作,但它不是正确的工具。您的模型应该代表您期望的资源。换句话说,如果在某种情况下你不想要 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.