ApiController如何接受多个变量?

时间:2012-08-29 13:17:08

标签: asp.net-mvc curl asp.net-web-api

我可以将多个变量传递给[HttpGet] 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中检查查询字符串,{&amp; AbsoluteUri被截断,只给我page=3

---更新结束

我也尝试了一个变量:

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

在测试中可以毫无问题地达到内部断点

curl http:// localhost:[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)
{
...
}

然后测试

curl http:// localhost:[port] / api / [controller] / GetAll?PageNumber = 3&amp; SortOrder = Name

这次,可以达到内部断点,这是一件好事。但该模型为null,未填充查询字符串中的数据。

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

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

根据要求,下面粘贴的是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的所有其他测试都可以毫无问题地进入操作。

4 个答案:

答案 0 :(得分:1)

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

你只需要改进你的Linux foo,因为&在Linux shell中有特殊意义......

来自Wikipedia

  
      
  • 有些Unix shell使用&符作为元字符:
  •   
  • 某些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"

答案 1 :(得分:0)

如果您没有使用基于操作的路由,那么您做错了。请尝试以下方法:

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

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

答案 2 :(得分:0)

尝试同时针对HttpRouteCollection注册您的路线。

答案 3 :(得分:-2)

在你的例子中:

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

那将永远不会有效,你不能得到一个模型,它必须是POST / PUTed。