4

有没有办法区分空值和根本没有提到的值?

例如,我希望客户端能够更新配置文件并且只影响请求中指定的值......即使是空/空值。

所以给定一个名称=“Sherlok”和出生日期=“1月6日”的个人资料:

POST api/profiles/update?name=Sherlock >> only modifies name

POST api/profiles/update?birthdate=&name=Sherlock >> modifies name AND clears birthdate

有没有办法区分这两种情况下的生日参数,还是我需要求助于魔法值?

4

2 回答 2

1

实际上有很多方法可以做到这一点。

  1. 正如@Badri 建议的那样,您可以Request直接在您的操作中使用该对象。这是一种非常直接和简单的方法,但是将控制器逻辑与格式化/绑定逻辑混合在一起。如果您想创建更好的关注点分离,请尝试以下方法之一。
  2. 您可以选择多种参数绑定机制。在我看来,自定义模型绑定器在这种情况下可以很好地工作。您可以访问Request模型绑定器中的对象并使用类似于@Badri 的代码的东西来设置您期望的值(String.Emptynull),然后再将它们传递给您的操作。
  3. 生日字段的值提供者可能是更好的选择。您正在传递一个最终可以转换为 DateTime 对象的字符串。如果您指定该参数应使用自定义值提供程序(例如IntuitiveDateTimeValueProvider),您实际上可以将您的操作中的参数类型更改为DateTimeor Nullable<DateTime>( DateTime?) 并让值提供程序适当地填充值。您还可以对想要区分空和空的更简单的字符串使用类似的策略(例如,ExistenceTestingStringValueProvider)。
  4. 创建额外的路线/行动。如果有很多参数,这不是一个好的选择,因为可能的组合太多了,但如果只有几个,这是一个非常简单的解决方案。一种方法是简单地为每个组合创建方法重载。如果只有 has 的重载name被命中,则表示birthdate未指定,但如果同时命中两个参数的重载,则表示birthdate已指定,即使它的值为null,为您提供一种区分指定但为空的参数值的方法和未指定的参数值。
于 2014-02-26T01:24:02.933 回答
0

如果您使用 ASP.NET Web API 绑定,这是不可能的。比如说,你有一个 DTO 类并使用它来进行这样的绑定。

public class MyDto
{
    public string Name { get; set; }
    public string BirthDate { get; set; }
}

public void Update([FromUri]MyDto dto) { }

当您BirthDate在查询字符串中省略或使用空值时,它基本上是相同的,并且BirthDate在两种情况下属性都将为空。但是,您可以像这样自己读取查询字符串。

string qs = Request.RequestUri.Query.Substring(1); // leave out ?
var pairs = System.Web.HttpUtility.ParseQueryString(qs);

在这种情况下,pairs["BirthDate"]如果您从查询字符串 (?name=Sherlock) 中省略该字段,则该字段将为空。

如果您在查询字符串中有一个空值 (?birthdate=&name=Sherlock),那么pairs["BirthDate"]它将是空字符串 ("")。

于 2014-02-25T05:13:14.863 回答