可选参数: "空" vs "未提供"

4

有没有一种方法可以区分空值和根本没有提到的值?

例如,我希望客户端能够更新个人资料,并且仅影响请求中指定的值...即使是空值/ null 值。

因此,假设一个名为“Sherlok”并且生日为“1月6日”的个人资料:

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

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

有没有办法区分这两种情况中的出生日期参数,或者我需要使用魔法值?
2个回答

1

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

  1. 正如 @Badri 建议的那样,您可以直接在操作中使用 Request 对象。这是一种非常简单直接的方法,但将控制器逻辑与格式化/绑定逻辑混合在一起。如果您想创建更好的关注点分离,请尝试以下方法之一。
  2. 您可以选择多种参数绑定机制。在我看来,自定义模型绑定程序可能在这种情况下效果很好。您可以在模型绑定程序中访问 Request 对象,并使用类似于 @Badri 的代码设置您期望的值(String.Emptynull)在它们传递到您的操作之前。
  3. 出生日期字段的值提供程序可能是一个更好的选择。您正在传递最终可以转换为 DateTime 对象的字符串。如果指定该参数应使用自定义值提供程序(例如 IntuitiveDateTimeValueProvider),则您实际上可以更改操作中参数的类型为 DateTimeNullable<DateTime> (DateTime?) 并让值提供程序适当地填充值。您还可以对更简单的字符串使用类似的策略,以区分空和 null(例如 ExistenceTestingStringValueProvider)。
  4. 创建其他路由/操作。如果有很多参数,这不是一个好的选择,因为可能会有太多可能的组合,但如果只有几个,这是一个非常简单的解决方案。一种方法是只为每个组合创建方法重载。如果命中了仅具有 name 的重载,则意味着未指定 birthdate,但如果命中了两个参数的重载,则意味着指定了 birthdate,即使其值为 null,也可以区分指定但为空的参数值和未指定的参数值。

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 属性将会在两种情况下都为 null。然而,你可以通过以下方式读取查询字符串。

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

在这种情况下,如果你从查询字符串中省略了字段(?name=Sherlock),pairs["BirthDate"] 将为 null。
如果你将其作为空值放入查询字符串中(?birthdate=&name=Sherlock),那么 pairs["BirthDate"] 将为空字符串 ("")。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接