首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web-Api路由解析阵列模型绑定

Web-Api路由解析阵列模型绑定
EN

Stack Overflow用户
提问于 2017-12-20 19:26:44
回答 1查看 202关注 0票数 0

我在试着理解Web是如何解决路由问题的。我有两条使用相同基本路径的路由

代码语言:javascript
复制
[WriteRoute(DivisionAPIRoutes.PAYROLL_IMPORT_PTO)]
[HttpPost]
public void ImportPTOByIds(GlobalEntityKey<IDivision> parentId, GlobalEntityKey<IDivisionPayCalendar> id,
    ImportPTORequestDTO importPTORequest, [FromUri] GlobalEntityKey<IPTORequest>[] ptoRequestIds)
{
    GlobalFactory<IEmployeePTOListService>.Instance.ImportPTOByIds(parentId, id, ptoRequestIds, importPTORequest);
}

[WriteRoute(DivisionAPIRoutes.PAYROLL_IMPORT_PTO)]
[HttpPost]
public void ImportPTOByFilter(GlobalEntityKey<IDivision> parentId, GlobalEntityKey<IDivisionPayCalendar> id, ImportPTORequestDTO importPTORequest, string filterOptions,
    [FromUri] GlobalEntityKey<IPTORequest>[] excludedPTORequestIds)
{
    var filterOptionsDTO = JsonConvert.DeserializeObject<FilterOptionsDTO>(filterOptions);
    GlobalFactory<IEmployeePTOListService>.Instance.ImportPTOByFilter(parentId, id, filterOptionsDTO, excludedPTORequestIds, importPTORequest);
}

注意:默认情况下,构建CLR类型字符串,int从URI中检索。

我提出了一个很好的post请求,但我试图理解路由如何解析到该方法的基本逻辑:

(为方便起见而解码)

“查询”:“"filterParameters":{"fieldName":"RequestStartDate",”parsebleValue:“2016-01-01”,"filterType":"GreaterThanOrEqual"},{"fieldName":"RequestStartDate","parsebleValue":"2017-12-31","filterType":"LessThanOrEqual"}} PostBody:{ AlwaysCreateNewCheck: false,PayBatchType:'Checks',PayBatchId:'1903771‘}

如果我忽略了请求中的,则为excludedPTORequestIds。这仍然将解析为ImportPTOByFilter filterOptions ,但是如果我包含了excludedPTORequestIds,而忽略了,则会选择 ImportPTOByIds

我倾向于认为,由模型绑定器处理的List和Array与其他默认CLR类型(string、int、Guid等)有不同的行为。

虽然字符串是必需的,并将抛出404或解析到其他路由,数组的不需要在请求中显式定义。

假设WebApi的路由解析的其他规则是什么是安全的。

EN

回答 1

Stack Overflow用户

发布于 2017-12-20 20:05:46

当您包含ImportPTOByFilter时,它将解析为filterOptions,因为另一条路由没有筛选器选项参数。

如果删除filter选项,它将解析为ImportPTOByIds,因为参数与方法签名匹配。路由解析将根据路由名称和参数进行。如果你有

代码语言:javascript
复制
RouteA(string myString, int myInt) {...}

代码语言:javascript
复制
RouteA(string myString) {...}

代码语言:javascript
复制
RouteA(int myInt) {...}

如果您传递一个字符串、int或两者,它将根据这个路由进行解析。

比我更有见识的其他人可能会添加更多的信息,但我认为您想要建立一个实际的模型--以这种方式封装整个请求--您有一个方法,在那个方法中,您检查模型以确定是否应该过滤它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47913086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档