我正在使用以下获取请求来查询以下Web API控制器,
/ api / records?aasdfsdf - 返回记录中的所有内容
/ api / records?search = aasdfsdf - 引发以下错误:
“找到了与请求匹配的多个操作:\ r \ nGetRecords
有人能够解释可能是什么原因吗?
public IQueryable<Record> GetRecord()
{
// return db.Records;
}
public IQueryable<Record> GetRecord(String search)
{
// return db.Record;
}
public IQueryable<Ecg> GetEcgs(String search,DateRange date)
{
// return db.Record;
}
public class DateRange
{
public DateTime start { get; set; }
public DateTime end { get; set; }
}
还有什么是正确的查询方式:
public IQueryable GetEcgs(String search,DateRange date)
我尝试过以下操作但是我得到了相同的“多重操作”错误。任何帮助将不胜感激。
/api/records?search=asdfsdf?start=2014-09-05%2014:02:17.757&end=2014-09-05%2014:02:17.757
答案 0 :(得分:0)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<div class="btn-group">
<button type="button" class="dropdown-toggle" data-toggle="dropdown">
Search <span class="caret"></span>
</button>
<div class="col-sm-12 dropdown-menu">
<select class="form-control" >
<option value="id">ID</option>
<option value="Name">Name</option>
</select>
<input type="text" class="form-control" />
<button>Reset</button>
<button id="search-btn" class="pull-right">Go</button>
</div>
</div>
此请求将路由到GetRecord()方法,因为您的查询字符串没有任何键值对,因此唯一可能的路由是GetRecord()
/api/records?aasdfsdf
此请求可以路由到GetRecord(字符串搜索)和GetEcgs(字符串搜索,DateRange日期),日期为null。这就是你有例外的原因。
您可以将控制器更改为以下内容以获取所需的路由:
/api/records?search=aasdfsdf
如果Ecg和Record都是相同的基类,则可以返回IQueryable&lt; BaseClass&gt;而不仅仅是对象。在我们的web api项目中,我们不使用控制器返回两种不同的类型,或者我们使用IHttpActionResult:
public IQueryable<Record> GetRecord()
{
// return db.Records;
}
public object GetRecord(String search, DateTime? start, DateTime? end)
{
if( start.HasValue && end.HasValue )
{
return this.GetEcgs(search, new DateRange(start,end));
}
return this.GetRecord(search);
}
//use private so it's not a possible route or use [NonAction]
private IQueryable<Record> GetRecord(String search)
{
// return db.Record;
}
private IQueryable<Ecg> GetEcgs(String search, DateRange date)
{
// return db.Record;
}
这比返回“对象”要好得多,但如果您有自定义过滤器将在控制器之后运行,那么您将需要返回对象而不是结果,因此您的使用会有所不同。