Get中的Web API复杂数据

时间:2014-07-16 07:33:20

标签: asp.net asp.net-mvc asp.net-web-api

我正在使用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 "";
        }

1 个答案:

答案 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操作的自然方式。但是你可以采取必要的预防措施。