我正在使用Web APi,因为我是新手,我不太了解它。 我正在尝试实现搜索,截至目前我只从文本搜索开始,但后来可能会有巨大的搜索条件。对于一个简单的文本,因为web api很好用 原始数据类型。现在我想创建一个过滤器类,比如pagenumber,pagesize也是所有的搜索条件,所以我创建了一个类。我创建了一个与web api通信的MVC应用程序,web api返回Json数据,然后我将其反序列化为模型。我坚持使用复杂的对象部分,现在我正在使用列表来获取数据,稍后将被数据库替换。以下是代码。
public IEnumerable<Document> Get(PaggingDetails request) //public async Task<IEnumerable<Note>> GetNotes() for Async (DB)
{
return _repository.GetAll(pagedetails.PageNumber, pagedetails.PageSize, pagedetails.PageFilter);
//return await db.Notes.ToListAsync<Note>(); for async
}
public string GetPage(int pagenumber,int pagesize,string pagefilter)
{
try
{
PaggingDetails PageDetails = new PaggingDetails();
PageDetails.PageFilter = pagefilter;
PageDetails.PageSize = pagesize;
PageDetails.PageNumber = pagenumber;
return new System.Net.WebClient().DownloadString
("http://.../api/Document/?pagedetails=" +
PageDetails);
//new HttpClient().GetStringAsync("http://localhost:18545/api/Emails"); for async
//also pass parameters
}
catch (Exception ex)
{
}
return "";
}
答案 0 :(得分:-1)
通过deafult,您不能使用类作为GET Web API操作的参数类型。您需要使用单个类型的单个参数。
如果你想使用一个类作为参数,没有什么能阻止你使用POST动作,你可以在其中包含数据而没有任何问题。
但是,您可以通过使用[FromUri]修改comples属性来强制从URI中读取GET操作的复杂参数。
您可以阅读本文档以更好地理解Web API参数绑定:
Parameter Binding in ASP.NET Web API
默认情况下,Web API使用以下规则绑定参数:
如果参数是“简单”类型,Web API会尝试从URI中获取值。简单类型包括.NET基元类型(int,bool,double等),以及TimeSpan,DateTime,Guid,decimal和string,以及具有可以从字符串转换的类型转换器的任何类型。 (稍后将详细介绍类型转换器。)
对于复杂类型,Web API尝试使用媒体类型格式化程序从邮件正文中读取值。
这是标准的工作方式。如果您使用[FromUri]
属性,则操作选择器无法在接收不同复杂类型的不同Get
方法之间进行选择。如果你使用带有控制器和动作片段的路线,你就不会遇到这个问题,因为无论参数是什么,动作选择器都会按动作名称选择。
由于这个原因,我不喜欢使用[FromUri]
,并且因为它不是使用GET操作的自然方式。但是你可以采取必要的预防措施。