【问题标题】:Routing optional parameters路由可选参数
【发布时间】:2012-07-17 17:18:54
【问题描述】:

我正在开发我的第一个 web api,但我一直在尝试为这些 url 创建规则

1) http://mydomain.com/values/4 --> this number can be any, this is just an example
2) http://mydomain.com/values/
3) http://mydomain.com/values/?param1=test1&param2=test2
4) http://mydomain.com/values/?param1=test1
5) http://mydomain.com/values/?param2=test2

我当前的路由规则是

routes.MapHttpRoute(
    name: "Route1",
    routeTemplate: "{controller}/{id}/"
);
routes.MapHttpRoute(
    name: "Route2",
    routeTemplate: "{controller}/{param1}/{param2}",
    defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional }
);

以及我为这些网址提供服务的方法

// GET values/
// GET values/?param1=test1&param2=test2
// GET values/?param1=test1
// GET values/?param2=test2
public IEnumerable Get(string param1, string param2)
{
    return new string[] { "value1", "value2" };
}

// GET values/5
public string Get(int id)
{
    return "value";
}

我有两个问题

1) http://mydomain.com/values/ 无法解析

2) http://mydomain.com/values/?param1=test1http://mydomain.com/values/?param2=test2 无法解析。

您能帮我创建提供这些网址的路线吗?

【问题讨论】:

    标签: c# asp.net asp.net-web-api


    【解决方案1】:
    routes.MapHttpRoute(
        name: "Route1",
        routeTemplate: "{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    

    应该做你需要的。查询字符串参数已经映射到Action参数,只要同名即可,不需要在路由中添加。

    【讨论】:

    • 谢谢,这很完美。唯一的问题是,正如我在问题中所说的那样,我想保持分离的方法。如果我有一个带有此签名public IEnumerable Get(int? id, string param1, string param2) 的单一方法,您的路线就有效
    • 你可以有 Get(int?id), Get(int?id, string param1) 或者任意组合,路由不允许这样。
    • 我想要Get(int? id)(用于我列表中的 url 1),Get(string param1, string param2)(用于其余)。有可能吗?
    • 如果您有额外的时间,请回答我对之前评论所做的问题。即使您不知道,我也会将此标记为已解决,因为它至少帮助我找到了一种实现方法。谢谢
    • 您需要从路由中删除 id 作为可选(完全删除)以消除对 int 的需要? ID。但是,如果您总是知道 id 将为 null,那么 Get(int? id, string param1, string param2) 有什么危害
    【解决方案2】:

    首先你不需要路线

    routes.MapHttpRoute(
      name: "Route2",
      routeTemplate: "{controller}/{param1}/{param2}",
      defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional }
    );
    

    其次要解析http://mydomain.com/values/,您需要通过将int? 设为可选参数id

    // GET values/5
    public string Get(int? id)
    {
      return "value";
    }
    

    【讨论】:

    • 对不起@Asif,但那是错误的。如果您这样做,则必须将路线 {id} 设置为可选。其次,如果您只使用 ?param2=... 调用 url,则不会使用两个参数来达到重载。
    • 如果你不希望 id 是可选的,那么mydomain.com/values 将如何解决没有 id 的问题。第二个参数 2 由名称识别,对于查询字符串,您不需要定义路由。
    • 试试看。如果您不将 {id} 设置为可选,则 mydomain.com/values 将不起作用。
    • 恐怕这行不通。它不能解决我的任何问题:(
    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 2012-03-24
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多