C#学习教程:在URL中使用斜杠“/”路由参数分享


在URL中使用斜杠“/”路由参数

我知道你可以在路由属性中应用通配符来允许/例如日期输入,例如:

 [Route("orders/{*orderdate}")] 

通配符的问题仅适用于URI中的最后一个参数。 如果要拥有以下URI,我该如何解决问题:

 [Route("orders/{orderdate}/customers")] 

更新:

我知道通过重构代码来解决问题的选择很少,所以请不要提供类似的解决方案:

  1. 将路线模板更改为[Route("orders/customers/{orderdate}")]
  2. 将日期更改为其他格式(例如"dd-mm-yyyy"

@bet ..我认为genericUriParserOptions不再适用于.net 4.5或更高版本..

同样如@JotaBe所建议的,您可能需要正确解码url请求。 在大多数情况下,%2F将自动转换为斜杠’/’,所以如果你需要转义它,你需要首先解码’%’字符..所以你的URL:看起来像:www。 domain.com/api/orders/23%252F06%252F2015/customers

请注意,字符’%252F’将转换为实际’%2F’

编辑

好的,这是完整的解决方案(试过它并为我工作):

  1. 假设你有一个像这样的API端点:

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { } 
  2. 在web.config中,您需要将requestPathInvalidCharacters设置为empty,告诉asp.net允许所有请求

             
  3. 当客户端向API发送请求时,您需要确保像这样转义’%’:

    http://www.domain.com/api/orders/23%252F06%252F2015/customers

  4. 然后,您需要解码请求

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015 } 

正如@AlexeiLevenkov的评论所指出的,这是错误的:

您不能在URL中有一个接受正斜杠的参数,因为这是一个分隔每个URL片段的特殊符号。 因此,只要在URL中包含此符号,就会有新的片段,并且单个参数不能包含多个片段。

如果您想了解更多细节,请阅读本文 ,但这些是最相关的摘录:

因此,查询字符串可以包含正斜杠,如果需要,它们根本不会定义路径段。

这些是问题的一些解决方案:

注意:您的原始问题是“查询字符串”,我对编码的评论是指查询字符串,它是问号后面的URL的最后一段(如果存在), like &id=27 我更正了你的问题,所以它没有提到“查询字符串”,这不是你需要的正确名称

您可以使用以下URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")]然后使用自定义模型绑定器来获取DD/MM/YY和将它们转换为您可以在操作方法中绑定的日期。

您可以选择如何处理约束(更严格地使用正则表达式)或使用validation并返回400(如果不匹配)。

更简单的方法是采用Day/Month/Year并将其放在代码中。

这是一个处理模型绑定的链接。

上述就是C#学习教程:在URL中使用斜杠“/”路由参数分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1031984.html

发表评论

邮箱地址不会被公开。 必填项已用*标注