我可以将多个变量传递给[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的所有其他测试都可以毫无问题地进入操作。
答案 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。