2012-08-29 38 views
3

我可以将多个变量传递给一个[HttpGet] ApiController操作吗?例如:ApiController如何接受多个变量?

[HttpGet] 
public IPagedList<Something> GetAll(int? page, string sortOrder="") 
{ 
... 
} 

我测试使用

curl http://localhost:[port]/api/[controller]/GetAll?page=3&sortOrder=Name 

但从来没有所谓的动作。返回的消息是:未找到与请求URI相匹配的HTTP资源。什么地方出了错?

---更新---

如果我检查HttpActionContext.Request.RequestUri.Query查询字符串,在符号截断AbsoluteUri并给我只能page=3

---更新完

我也试过一个变量:

[HttpGet] 
public IPagedList<Something> GetAll(int? page) 
{ 
... 
} 

内的破发点,可以毫无问题地在测试达到

卷曲的http://本地主机: [port]/api/[controller]/GetAll?page = 3

我还创建了一个查看模型:

public class ListRequestModel 
{ 
    public string SortOrder { get; set; } 
    public string CurrentFilter { get; set; } 
    public string SearchString { get; set; } 
    public int PageNumber { get; set; } 
} 

动作是这样的:

[HttpGet] 
public IPagedList<Something> GetAll(ListRequestModel model) 
{ 
... 
} 

然后测试

卷曲的http://本地主机:[端口]/API/[控制器]/GETALL的PageNumber = 3 & SortOrder的=命名

这一次,里面的折点可以达到,这是一件好事。但该模型为空,不会填充查询字符串中的数据。

那么,将多个变量传递给动作方法的正确方法是什么?请帮忙。谢谢。

---------- -----------更新

正如RouteConfig.cs文件要求,粘贴下面是路由表:

routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

Global.asax.cs,AreaRegistration.RegisterAllAreas();之前RouteConfig.RegisterRoutes(RouteTable.Routes);但是没有区域路线以api开头。我对该ApiController的所有其他测试都可以毫无问题地进入操作。

+0

什么在您的全局。 ASAX? – Liam

+0

RegisterAllAreas,RegisterRoutes,Configure和RegisterGlobalFilters。 你怀疑我们的路由表吗? – Blaise

+0

@Blaise是的,请张贴你的路由表。 – nemesv

回答

1

您的路由和设置没问题。当然,您可以将多个参数传递给控制器​​。

你只需要提高你的Linux富,因为&在Linux shell的特殊含义......

Wikipedia

  • 一些Unix外壳使用符号元字符:
  • 某些Unix shell与POSIX标准sh shell一样,使用&符号在后台执行进程并复制文件描述符 。
  • 在Bash中,&字符可以分隔单词,控制命令历史记录,复制文件描述符,执行逻辑操作,控制作业并参与正则表达式。

所以你需要躲避符号&有反弹\在您的命令

curl http://localhost:[port]/api/[controller]/GetAll?page=3\&sortOrder=Name 

或者使用引号""周围的网址:

curl "http://localhost:[port]/api/[controller]/GetAll?page=3&sortOrder=Name" 
+0

只是有一个测试。哇!有用!非常感谢。我没有使用Unix机器。 '\&'方法失败。但引号就像是一种魅力。 – Blaise

0

如果你没有使用基于动作的路由,你做错了。请尝试以下操作:

curl http://localhost:[port]/api/[controller]?page=3&sortOrder=Name 

在另一方面,如果你正在运行相同的上下文下的Web API应用程序和ASP.NET MVC,确保你的MVC问题之前注册的Web API的路线。否则,默认的MVC路由将捕获所有的Web API请求,并且很可能返回404。

+0

我用'[HttpGet]'来装饰动作。只是更新我的问题,以反映这一点。而且我还在更新中发布了我的路由表。事情是,一些行动可以没有任何问题地达成。只有我需要的那个有多个变量的人遇到了麻烦。 – Blaise

0

尝试注册您的路线对HttpRouteCollection以及。

-2

在您的例子:

[HttpGet] 
public IPagedList<Something> GetAll(ListRequestModel model) 
{ 
... 
} 

,将永远不会工作,你不能让一个模型,它必须是POST/PUTed。

+0

我明白为什么他人downvote您的帖子。我们当然可以发送一个json数据到GET操作。 – Blaise