我的印象是,模型中的ASP.Net的Web API的结合应该支持通过MVC支持的功能相同的最低水平结合。
看看下面的控制器:
public class WordsController : ApiController
{
private string[] _words = new [] { "apple", "ball", "cat", "dog" };
public IEnumerable<string> Get(SearchModel searchSearchModel)
{
return _words
.Where(w => w.Contains(searchSearchModel.Search))
.Take(searchSearchModel.Max);
}
}
public class SearchModel
{
public string Search { get; set; }
public int Max { get; set; }
}
我与要求它:
http://localhost:62855/api/words?search=a&max=2
不幸的是,模型不绑定,因为它会在MVC。 为什么这个没有约束力,因为我所期望的? 我将有很多不同的模型类型在我的应用程序。 这将是很好,如果结合只是工作,就像它在MVC一样。
看看这个: 的WebAPI如何参数绑定
你需要来装饰你的复杂的参数,如下所示:
public IEnumerable<string> Get([FromUri] SearchModel searchSearchModel)
要么
public IEnumerable<string> Get([ModelBinder] SearchModel searchSearchModel)
我发现整个Web API 2是有很多“陷阱”我读了几覆盖这一丰富的产品提供了许多神秘的细微差别的重点图书艰难的学习曲线。 但基本上,我认为必须有一些可以利用的最好的功能核心功能。 所以,我所要做的四级连胜前进的任务。 1.接受查询字符串,从一个浏览器,到API2客户端和填充一个简单的.NET模型。 2.在客户端提交一个异步张贴在JSON编码的API2服务器与现有型号3.提取在服务器做一个简单的转换从客户端POST请求。 4.它传递的所有备份到浏览器中。 就是这个。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Threading.Tasks; using Newtonsoft.Json; namespace Combined.Controllers // This is an ASP.NET Web Api 2 Story { // Paste the following string in your browser -- the goal is to convert the last name to lower case // The return the result to the browser--You cant click on this one. This is all Model based. No Primitives. // It is on the Local IIS--not IIS Express. This can be set in Project->Properties=>Web http://localhost/Combined with a "Create Virtual Directory" // http://localhost/Combined/api/Combined?FirstName=JIM&LastName=LENNANE // Paste this in your browser After the Default Page it displayed // public class CombinedController : ApiController { // GET: api/Combined This handels a simple Query String request from a Browser // What is important here is that populating the model is from the URI values NOT the body which is hidden public Task<HttpResponseMessage> Get([FromUri]FromBrowserModel fromBrowser) { // // The Client looks at the query string pairs from the Browser // Then gets them ready to send to the server // RequestToServerModel requestToServerModel = new RequestToServerModel(); requestToServerModel.FirstName = fromBrowser.FirstName; requestToServerModel.LastName = fromBrowser.LastName; // Now the Client send the Request to the Server async and everyone awaits the Response Task<HttpResponseMessage> response = PostAsyncToApi2Server("http://localhost/Combined/api/Combined", requestToServerModel ); return response; // The response from the Server should be sent back to the Browser from here. } async Task<HttpResponseMessage> PostAsyncToApi2Server(string uri, RequestToServerModel requestToServerModel) { using (var client = new HttpClient()) { // Here the Method waits for the Request to the Server to complete return await client.PostAsJsonAsync(uri, requestToServerModel) .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode()); } } // POST: api/Combined This Handles the Inbound Post Request from the Client // NOTICE THE [FromBody] Annotation. This is the key to extraction the model from the Body of the Post Request-- not the Uri ae in [FromUri] // Also notice that there are no Async methods here. Not required, async would probably work also. // public HttpResponseMessage Post([FromBody]RequestToServerModel fromClient) { // // Respond to an HttpClient request Synchronously // The model is serialised into Json by specifying the Formatter Configuration.Formatters.JsonFormatter // Prep the outbound response ResponseToClientModel responseToClient = new ResponseToClientModel(); // // The conversion to lower case is done here using the Request Body Data Model // responseToClient.FirstName = fromClient.FirstName.ToLower(); responseToClient.LastName = fromClient.LastName.ToLower(); // // The Client should be waiting patiently for this result // using (HttpResponseMessage response = new HttpResponseMessage()) { return this.Request.CreateResponse(HttpStatusCode.Created, responseToClient, Configuration.Formatters.JsonFormatter); // Respond only with the Status and the Model } } public class FromBrowserModel { public string FirstName { get; set; } public string LastName { get; set; } } public class RequestToServerModel { public string FirstName { get; set; } public string LastName { get; set; } } public class ResponseToClientModel { public string FirstName { get; set; } public string LastName { get; set; } } } }