将routeTemplate定义为" api / {controller} / {id}"并在我的控制器中使用以下方法(ValuesController)
[HttpGet]
public IEnumerable<string> GetX()
{
return new string[] { "xx1", "xx2" };
}
[HttpGet]
public IEnumerable<string> GetY([FromUri]Customer c)
{
return new string[] { "c1", "c2" };
}
public class Customer
{
public bool IsMarried { get; set; }
public string CustName { get; set; }
}
使用网址 - &#34; / api / values?IsMarried = false&amp; CustName = aa&#34;导致错误 - &#34;发现多个匹配请求的操作...&#34; 。 如果不将routeTemplate更改为&#34; api / {controller} / {action} / {id}&#34;,我就无法解决上述问题。 如果有人知道如何在不改变routeTemplate的情况下修改上述内容。
答案 0 :(得分:1)
使用简单类型并将它们映射到控制器中:
[HttpGet]
public IEnumerable<string> GetY(bool IsMarried, string CustName)
{
var cust = new Customer {IsMarried = IsMarried, CustName = CustName};
return new string[] { "c1", "c2" };
}
请注意,您将丢失ModelState.IsValid
等功能,因此您需要手动调用验证程序。
查看Action Selection部分,了解它对简单和复杂参数的工作原理。
答案 1 :(得分:1)
解决方案一:路由
[RoutePrefix("api")]
public class FooController : ApiController
{
[Route("Foo/getall")]
[HttpGet]
public IEnumerable<string> GetX()
{
return new string[] { "xx1", "xx2" };
}
[Route("foo/search")]
[HttpGet]
public IEnumerable<string> GetY([FromUri]Customer c)
{
return new string[] { "c1", "c2" };
}
public class Customer
{
public bool IsMarried { get; set; }
public string CustName { get; set; }
}
}
请记住添加属性路由映射:
configuration.MapHttpAttributeRoutes();
解决方案二:可选参数
[RoutePrefix("api")]
public class FooController : ApiController
{
[HttpGet]
public IEnumerable<string> GetY([FromUri]Customer c)
{
if(c == null)
// no parameters where set.
if(c.IsMarried != null)
// do stuff
// etc....
return new string[] { "c1", "c2" };
}
public class Customer
{
public bool? IsMarried { get; set; }
public string CustName { get; set; }
}
}
答案 2 :(得分:1)
如果你不能指定动作名称,那么你有两个选择。
创建一个带有默认值(引用类型为null)参数的重载。根据参数的状态,执行approriate操作。由于您的样本非常抽象,我不知道这是否适合您。
return new LogoList(input1);
创建一个新的Controller并在那里定义您的附加操作。如果行为本质上非常不同,这可能是更好的解决方案。此处不需要代码示例,只需创建一个新控制器并移动现有方法。