ASP.NET Web API中的可选参数

我需要实现以下WebAPI方法:

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

所有参数都可以为null,即调用者可以从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路由中指定可选参数?


此问题已在MVC4的常规版本中得到解决。 现在你可以这样做:

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

所有的东西都可以在盒子里运行。


可以像vijay建议的那样将多个参数作为单个模型传递。 这适用于使用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; }
}

更新
为了确保值是可选的,请确保为模型属性使用引用类型或可空(例如int?)。


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

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}
链接地址: http://www.djcxy.com/p/65897.html

上一篇: Optional parameters in ASP.NET Web API

下一篇: Returning binary file from controller in ASP.NET Web API