在ASP.NET的Web API可选查询字符串参数(Optional query string pa

2019-06-26 21:00发布

我需要实现以下的WebAPI方法:

/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX

所有查询字符串参数可以为空。 也就是说,主叫方可以指定一个从0到所有5个参数。

MVC4公测我曾经做到以下几点:

public class BooksController : ApiController
{
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date) 
    {
        // ...
    }
}

MVC4 RC没有这样的表现了。 如果我指定少于5个参数,它回复一个404的说法:

没有行动上的控制器“图书”与请求匹配的发现。

什么是正确的方法签名,以使其行为像以前那样,而不必指定的URL路由可选参数?

Answer 1:

此问题已被固定在MVC4的定期发布。 现在,你可以这样做:

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}

这样就可以了开箱即用。



Answer 2:

这是可能的传递多个参数作为一个单一的模型维杰建议。 当您使用FromUri参数属性,这适用于GET。 这告诉的WebAPI从查询参数填充模型。

其结果是,只是一个单一参数,更清洁的控制器动作。 更多信息请参见: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

public class BooksController : ApiController
  {
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks([FromUri]BookQuery query)
    {
      // ...
    }
  }

  public class BookQuery
  {
    public string Author { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
    public string SomethingElse { get; set; }
    public DateTime? Date { get; set; }
  }

它甚至还支持多个参数,只要性质不冲突。

// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging)
{
  // ...
}

public class Paging
{
  public string Sort { get; set; }
  public int Skip { get; set; }
  public int Take { get; set; }
}

更新
为了确保该值是可选确保使用引用类型或nullables(前。诠释?)为模型的属性。



Answer 3:

使用初始默认值,像下面的所有参数

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}


Answer 4:

如果你想传递多个参数,那么你可以创建模型,而不是通过多个参数。

如果你不想传递任何参数,那么你可以跳过以及在里面,你的代码看起来整洁干净。



Answer 5:

默认值不能为参数提供未声明“ optional

 Function GetFindBooks(id As Integer, ByVal pid As Integer, Optional sort As String = "DESC", Optional limit As Integer = 99)

在你WebApiConfig

 config.Routes.MapHttpRoute( _
          name:="books", _
          routeTemplate:="api/{controller}/{action}/{id}/{pid}/{sort}/{limit}", _
          defaults:=New With {.id = RouteParameter.Optional, .pid = RouteParameter.Optional, .sort = UrlParameter.Optional, .limit = UrlParameter.Optional} _
      )


文章来源: Optional query string parameters in ASP.NET Web API