如果我们在Web API中有以下控制器操作
public async Task<HttpResponseMessage> GetRoutes(
[FromUri] MapExtentQuery extent,
[FromUri] PagingQuery paging)
{
...
}
带
class MapExtentQuery {
public int X { get;set; }
public int Y { get; set; }
}
class PagingQuery {
public int Skip { get; set; }
public int Top { get; set; }
}
我们向GET
发出/routes
个请求extent
和paging
} null
。
如果请求包含至少一个查询字符串参数,例如
/routes?x=45
然后两个复杂的参数都会被初始化,所以在第二条路线的情况下
extent.X = 45
extent.Y = 0
paging != null
(但Skip
和Top
当然是0。
为什么[FromUri]
活页夹以这种方式工作?它几乎没有任何意义。
我会理解它是否只初始化了包含与至少一个查询字符串值匹配的属性的参数。
问题是,这种行为要求我们检查参数何时为空(仅在没有提供查询字符串参数的情况下发生),然后自己初始化它们。
因为很明显那些复杂的参数可能有一些构造函数会将某些属性值设置为默认值。
答案 0 :(得分:0)
这是因为当您没有查询字符串且参数具有FromUri属性时,查询字符串的解析器不会运行且所有值都没有绑定 - 您将收到null。
如果您有查询字符串,则绑定程序将运行并使用其默认值实例化所有FromUri参数和基元类型,然后尝试从查询字符串值填充属性。这将为您留下两个实例化参数,但只有一个具有填充值,因为这是查询字符串的全部内容。
至于为什么它以这种方式工作 - 很可能是性能 - 这样他们就不需要找到他们需要实例化的参数 - 他们实例化所有参数然后找到属性。它更快,性能在动作和模型绑定中至关重要。