2012-06-22 17 views
5

Ben ASP.NET MVC 4 RC Web API garip bir bağlayıcı sorun olarak düşündükleri alıyorum. İstemciden gelen posta isteklerini kabul etmeyi amaçlayan bir yöntem var. Sorun, post metodu çağrıldığında parametrelerin hiçbirinin bağlayıcı olmaması, fırlatma hattında ve ismimde kopma noktama ulaşmam, e-postanın ikisi de boş olmasıdır. İsteğin türünü JavaScript’te GET olarak değiştirirsem, aşağıdaki parametreye bağlı parametreler çağrılır.ASP.NET MVC 4 RC Web API Parametre Bağlama Sayı

Neden Mesaj yöntemi için bağlamak için başarısız parametrelerdir ve bunu nasıl düzeltebilirim?

send: function(evt) { 
    evt.preventDefault(); 
    $.ajax({ 
     url: '/api/person', 
     data: this.model.toJSON(), 
     type: "POST", 
     dataType: "json", 
     success: function(data) { 
      console.log("Success"); 
     }, 
     error: function(data) { 
      console.log("Error"); 
     } 
    }); 
    } 

aşağıdaki kontrolör eylemler geçerli:

public void Get(string name, string email) { 
    throw new NotImplementedException(); 
} 

public void Post(string name, string email) { 
    throw new NotImplementedException(); 
} 

Notlar: ASP.NET MVC 4 RC Web API için varsayılan (Yani deserializer tüm kullanıyorum

  • olmalıdır Json.NET)
  • JS hata ayıklayıcısındaki Chrome ağ sekmesi, form verisindeki doğru gönderimdeki parametreleri gösterir.

cevap

13

MVC (web sayfaları) 'nın aksine, basit parametre türleri will not, by default, bind from the post body but instead from the URI. Yani, kodunuzun olduğu gibi name ve email parametrelerini sorgu dizesinde veya yol parametreleri olarak geçirmeniz gerekir. Bununla birlikte, bu, kolayca (MVC argo) bir model tipi oluşturma ve yöntem parametreleri için kullanılarak çözülebilir

. Ben yöntemlerle sırf için dönüş türleri sıkışmış ettik

public class SomeParams { 
    public string name { get; set; } 
    public string email { get; set; } 
} 

//now an alternative way to write the Get method 
public MyResult Get([FromUri] SomeParams p){ 
    //members are bound from the query string (more like MVC traditional binding) 
    //note - as in MVC, SomeParams will need a default constructor for this to work. 
} 

public PostResult Post(SomeParams p){ 
    //'p' is bound from your JSON (assuming correct format) 
    //because 'complex' types are deserialized using formatters 
    //only one object can be read from the body with a formatter in Web API 
    //as the request body is not buffered; unlike MVC. 
} 

: o zaman olsun yöntemine [FromUri] kullanırsanız Aslında, sonra (eğer verdiğim durumunda) hem de kullanabilirsiniz bir şeyleri geri vermek zorunda kalacaklar!

Gerçekten yukarıda (ve onun diğer birçok) bağlantı veren Mike durak'ın makaleyi okumanızı tavsiye ederiz.

aynı paradigmalar paylaşır ve MVC hatta sınıf isimleri, aslında MVC ile aynı, çünkü söz konusu Web API varsaymak cazip - ama değil. Başlangıçta bunun neden böyle olduğunu merak ettim (MVC'nin üst kısmında bir çok REST servisi yazmıştım ve birkaç yardımcı program sınıfı ve temel sınıf geliştirmeleri yazdıktan sonra oldukça güzel olduğunu fark ettim) Bir web API'sı yazmanın zorluklarına iyi bir bakış attılar ve muhtemelen sahip oldukları yaklaşımdaki değişiklikleri yapmanın doğru olduğunu düşünüyorum.

Ancak, biz verilmiş ve Web API için onları yeniden öğrenmek için şimdi sürebilir birkaç şey almak zorunda olduğu anlamına gelmez.

+0

Al parametrem geçersizdir, aslında mevcut değil. Açık olmayabilirdim ama sadece işlevin GET üzerinde çalıştığını ve POST'ta bulunmadığını göstermek için var. – Cody

+1

Tamam - peki, o zaman sorun değil :). Kısacası, eğer talebin gövdesinden birden fazla parametre bağlarsanız, temel olarak yapılacak en kolay şey, gösterdiğim gibi basit bir model tipi yazmaktır. –

+0

Mike Stall makale bağlantısı için teşekkürler, neler olduğu hakkında çok bilgilendirici oldu. Web API'nın MVC ile tam olarak aynı ciltleme stratejisini kullandığını varsaymıştım. Parazitleri almak için özel bir sınıf oluşturmak bir cazibe gibi çalıştı, ben bu çözümün hayranı değilim ama nedenini anlayamıyorum, bu yüzden muhtemelen inatçı oluyorum. :) Her durumda kullanacağım çözüm. Teşekkürler!:) – Cody