WebAPI控制器相同的动作不同的参数
本文关键字:参数 控制器 WebAPI | 更新日期: 2023-09-27 18:15:28
我有一个基本控制器作为2个动作:
[ActionName("Find")]
[HttpGet]
public virtual IHttpActionResult Find(string name)
{
return null;
}
[ActionName("Find")]
[HttpGet]
public virtual IHttpActionResult Find(int number)
{
return null;
}
我的一些控制器使用不同的Find方法,例如:
public override IHttpActionResult Find(string number)
{
return OK;
}
但是,当从客户端调用此操作时,我得到一个错误:
Multiple actions were found that match the request: 'r'nFind on type API.Controllers.CustomerController
我该如何解决这个问题?
解决这个问题的唯一方法是更改其中一个操作的ActionName
属性。
ASP。. NET MVC/Web API不支持在同一个控制器中具有相同名称和相同HTTP动词的两个操作。
也看一下这个问题(ASP。. NET MVC模糊动作方法),如果你想去"破解解决方案"(我的意见)。
为什么不把两个参数都传递给同一个action方法呢?在你的方法内部,检查它们是否为空,并做一些处理。
使用string和int?(nullable int)允许两个形参都包含空值。
这样你就可以使用一个视图,而不需要任何属性切换。
我认为,你应该重新考虑你的端点结构:
从资源集合中选择一个元素的操作应该沿着资源的键(即唯一的数据库键)执行。该键可以是int型或字母型,但不能两者都是。
对于其中一个或两个find,您可能想要实现的是建立一个过滤函数。过滤器参数应该作为查询字符串参数传递给REST端点。
例子:
- /api/员工→返回包含所有员工的资源集
- /api/员工/5 →返回单个资源(一个雇员)
- /api/员工?name =约翰→返回所有员工名为"john"的资源集
示例3是一个过滤器,我猜您的查找结果中至少有一个是这样的