基于 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
.
采取以下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
.