Asp.net Get中的Web API复杂数据

Asp.net Get中的Web API复杂数据,asp.net,asp.net-mvc,asp.net-web-api,Asp.net,Asp.net Mvc,Asp.net Web Api,我正在使用WebAPI,因为我对它还不熟悉,所以我对它不太了解。 我正在尝试实现搜索,现在我只开始文本搜索,但以后可能会有巨大的搜索条件。对于一个简单的文本,web api可以很好地与 基本数据类型。现在我想创建一个过滤器类,比如pagenumber、pagesize以及所有搜索条件,所以我创建了一个类。我创建了一个与web api通信的MVC应用程序,web api返回Json数据,然后将其反序列化到模型。我一直在处理复杂的对象部分,现在我正在使用一个列表来获取数据,稍后它将被数据库所取代。下

我正在使用WebAPI,因为我对它还不熟悉,所以我对它不太了解。 我正在尝试实现搜索,现在我只开始文本搜索,但以后可能会有巨大的搜索条件。对于一个简单的文本,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 "";
        }

根据deafult,您不能使用类作为GetWebAPI操作的参数类型。您需要使用单个类型的单个参数

如果您想使用类作为参数,没有什么可以阻止您使用POST操作,在该操作中您可以毫无问题地包含数据

但是,可以通过使用[FromUri]修饰comples属性,强制从URI读取GET操作的复杂参数

您可以阅读本文档以更好地理解Web API参数绑定:

默认情况下,Web API使用以下规则绑定参数:

如果参数是“简单”类型,Web API将尝试从URI获取值。简单类型包括.NET基本类型int、bool、double等,加上TimeSpan、DateTime、Guid、decimal和string,再加上任何带有可从字符串转换的类型转换器的类型。有关类型转换器的更多信息,请稍后参阅

对于复杂类型,Web API尝试使用媒体类型格式化程序从消息体读取值

这是标准的工作方式。如果使用[FromUri]属性,操作选择器将无法在接收不同复杂类型的不同Get方法之间进行选择。如果使用带有控制器和动作段的路由,则不会出现此问题,因为动作选择器将按动作名称进行选择,而不管参数是什么

出于这个原因,我不喜欢使用[FromUri],因为它不是处理GET操作的自然方式。但是你可以在必要的预防措施下使用它