25

yılında yaptığı gibi ben ASP.Net Web API bağlayıcı modeli MVC tarafından desteklenen işlevsellik aynı minimum seviyede bağlanma desteklemek gerekiyordu izlenim altında oldu çalışmıyor bağlandığı görülmüştür. Ben bunu talep ediyorumASP.Net Web API modeli MVC 3

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; } 
} 

:

aşağıdaki denetleyicisi atın o MVC yaptığınız gibi

http://localhost:62855/api/words?search=a&max=2 

Maalesef modeli bağlamaz. Bu neden beklediğimden bağlayıcı değil? Uygulamamda birçok farklı model türüne sahip olacağım. MVC'de olduğu gibi, sadece işe yaradıysa, iyi olurdu.

+0

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; } } } }

Belki [1] Sorun, bu [yazı] size yardımcı olur. [1]: http://stackoverflow.com/questions/12072277/reading-fromuri-and-frombody-at-the-same-time – Cagdas

cevap

27

bu bir göz atın: How WebAPI does Parameter Binding

Çok sevdiği karmaşık parametre süslemek gerekir:

public IEnumerable<string> Get([FromUri] SearchModel searchSearchModel) 

VEYA

public IEnumerable<string> Get([ModelBinder] SearchModel searchSearchModel) 
1

Olmak tüm Web API 2 bulduk "Sorunlar" dolu zor bir öğrenme eğrisi bu zengin ürün sunan birçok gizli nüansları kapak kilit kitapların birkaç okudum. Ama temel olarak, özelliklerin en iyi şekilde yararlanabileceği bazı temel işlevlerin olması gerektiğini düşündüm. Yani, dört düz ileri işi yapmak için yola çıktım. 1. Bir API2 Client içine bir tarayıcıdan bir sorgu dizesi kabul edin ve basit bir .NET modeli doldurmak. 2. Müşteri Müşteriden Mesaj İsteği üzerine önemsiz bir dönüşüm yapmak 3. Server var önceki Modeli çıkarılan JSON kodlanmış bir API2 Server bir zaman uyumsuz Yayınla göndermek var. Hepsini geri Tarayıcı kadar 4. Geçiş. Budur.