Post parametresi her zaman boş


197

WebAPI için RC'ye yükseltme yaptığımdan beri, WebAPI'mda POST çağırırken gerçek bir garip sorun yaşıyorum. Hatta yeni projede üretilen temel sürüme geri döndüm. Yani:

public void Post(string value)
{
}

ve Fiddler'den arama:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

Hata ayıkladığımda, "değer" dizesi asla atanmıyor. Her zaman NULL. Bu sorunu yaşayan var mı?

(Sorunu ilk önce daha karmaşık bir türle gördüm)

Sorun yalnızca ASP.NET MVC 4'e bağlı değildir, aynı sorun RC kurulumundan sonra yeni bir ASP.NET MVC 3 projesi için de oluşur


Sadece soruna eklemek için - sadece JSON için değil, XML ile de olur.
ianrathbone

3
Ben iki gün boyunca bu ile mücadele ve bu konuda bulabildiğim her makale okuduktan sonra, WebRequest JSON dizesini doğru biçimlendirme kadar basit olduğu ortaya çıktı: Veri çift tırnak ile başlamalı ve bitmelidir json verileriniz boyunca tek tırnak kullanın, hepsi güzel oynuyor.
Gineer

Yanıtlar:


101

Yalnızca bir parametreniz olduğundan, onu parametreyle süslemeyi deneyebilirsiniz. [FromBody] özniteliği veya burada önerdiğim gibi, özellik olarak değerli bir DTO kabul etme yöntemini değiştirebilirsiniz: MVC4 RC WebApi parametre bağlama

GÜNCELLEME: Resmi ASP.NET sitesi bugün mükemmel bir açıklama ile güncellendi: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 1

Özetle, gövdeye tek bir basit tür gönderirken, yalnızca eşittir işaretiyle (=) ön ekli değeri gönderin, örn. Gövde:

=test


9
Ben [FromBody] bir koşuşturma verdim ama hiçbir değişiklik yoktu
ianrathbone


8
=Jim'in tavsiyelerini (JSON nesnesi olarak değil) takip edene ve işe yarayana kadar ön taraftaki ek benim için hiç işe yaramadı. Bu anahtar! WebAPI'nin ne kadar seçici olduğunu gerçekten sevmiyorum.
gitsitgo

16
Bu o kadar aptalca ve sinir bozucu ki sorunumu çözmeme yardımcı olan cevabı iptal edip etmemeyi bilmiyorum ... Neden bu formatta olmalı? (Tutum için özür dilerim, bu konuda çok fazla zaman harcadım ve hiçbir anlam ifade etmiyor ... :(). İnsanların kabul etmesini beklediği biçime gerçekten destek eklemelisiniz.
gdoron, Monica

6
Teşekkürler! Sadece bir parametre gönderirken parametre adını kaldırmamız gerektiğini nasıl bilebiliriz? Bu fikri hangi kuş beyni buldu?
Jenny O'Reilly

104

Bugün bunun üzerinde başımı kaşıyorum.

Benim çözümüm [FromBody]birHttpRequestMessage esasen HTTP yığın yukarı hareket.

Benim durumumda json sıkıştırılmış tel üzerinden veri gönderiyorum ki daha sonra base64'd. Tüm bu bir android app.

Web uç noktamın orijinal imzası şuna benziyordu (kullanarak [FromBody]):

Orijinal uç noktam

Bu sorun için düzeltmem, HttpRequestMessageuç noktamın imzası için bir kullanmaya geri dönmekti.

resim açıklamasını buraya girin

Daha sonra bu kod satırını kullanarak gönderi verilerine erişebilirsiniz:

resim açıklamasını buraya girin

Bu işe yarar ve ham el değmemiş posta verilerine erişmenizi sağlar. Kemancı dizenizin başına bir = işareti koyarak veya içerik türünü değiştirerek uğraşmak zorunda değilsiniz.

Bir kenara, ilk önce içerik türünü "İçerik-Tipi: uygulama / x-www-form-urlencoded" olarak değiştirmek için yukarıdaki cevaplardan birini izlemeye çalıştım. Ham veriler için bu kötü bir tavsiye çünkü + karakterleri çıkarıyor.

Yani şöyle başlayan bir base64 dizesi: "MQ0AAB + LCAAAAAA" bu "MQ0AAB LCAAAAAA" gibi sonuçlanır! Ne istiyorsan değil.

Kullanmanın bir başka yararı da, HttpRequestMessageuç noktanızdaki tüm http başlıklarına erişebilmenizdir.


6
Mükemmel çözüm ... bunu bulmam 9 saat sürdü, [FromBody] dize değerini kaldırdıktan ve HttpRequestMessage
Kev

1
Tıkır tıkır çalışıyor! ancak belirli bir nesnenin gerçek parametre türünü kullanmanın bir yolu yok mu? örneğin, web api yöntemi için sipariş türü parametresi?
Ron Nuni

7
Sadece bir yan not, HttpRequestMessage requesther zaman zaten sahip olduğunuz için, yöntem imzasında GEREKMEZ. Yöntem gövdesinde Requestnesneye erişilebilir . ör.Request.Content.ReadAsStringAsync().Result;
Morvael

Genellikle bu sorunun nedeni JSON nesnenizin yanlış olmasıdır. Ben her zaman yapıcı geçersiz bir türü ve Json bunu nasıl bir rehber gibi bir dize dönüştürmek bilmiyor çünkü buldum. Yani dönüştürücüyü ayarlar aracılığıyla ekleyin veya boş bir kurucu ekleyin ve bunun gibi eski koda geri dönmeniz gerekmez.
Nick Turner

En kolay yol, nesneyi bir dizeye geçirmek ve sonra dönüştürmeyi denemek ve JSON hatasını göreceksiniz. Üstbilgilerinizi de kontrol edin.
Nick Turner

71

Ben sadece Fiddler kullanarak bu oldu. Sorun belirtmemiştim Content-Type.

Content-TypePOST isteğinize bir başlık eklemeyi deneyin .

Content-Type: application/x-www-form-urlencoded

Alternatif olarak, aşağıdaki yorumlara göre bir JSON başlığı eklemeniz gerekebilir

Content-Type: application/json

11
Content-Type: application / json
dvallejo

2

2
application / x-www-form-urlencoded benim için çalışmadı, Content-Type: application / json.
liang

1
İçerik türünden bağımsız olarak, yalnızca bir parametreniz varsa, isteğin gövdesinde yalnızca parametre adı olmayan değeri göndermeniz gerekir. Yani id = 13 çalışmaz. Sadece 13 tane göndermelisin. Jim'in cevabına bakın.
Jenny O'Reilly

Kullanmak zorunda kaldım contentType: "application/x-www-form-urlencoded; charset=UTF-8", tam bir örnek için bkz. Complete Cient and Server
RyBolt

57

Ben de bu problemle karşılaştım ve problemimi bu şekilde çözdüm

webapi kodu:

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

müşteri kodu:

$.post( "webapi/address", { value: "some value" } );

1
İstemci JSON gönderiyorsa bu çalışır. Ben dize gibi basit bir değer gönderiyorsanız some value, o datazaman null.
brianestey

kolay, js nesnesini geri göndermek için istemci kodunuzu değiştirin.
George


Json gönderiyorsanız, var json = JsonConvert.SerializeObject (data);
dvallejo

41

Ben kullanıyordum Postmangeçen .. ve ben aynı hatayı yapıyordu valuedize yerine json olarak nesneyi

{
    "value": "test"
}

Api parametresi tür dizgideyse , yukarıdakiler yanlıştır .

Bu nedenle, dizeyi api gövdesinde çift tırnak işareti ile geçirin:

"test"

2
Bu benim sorunumdu ve muhtemelen sorunun gerçek çözümü idi. JSON kodlu bir dizenin tırnak işaretleri vardır
Kyle W

1
Postacıda da bu sorunla karşılaştım. Content-Type application / json olarak ayarlandığında Body için "raw" yerine "form-data" yanlışı seçtiğim ortaya çıkıyor. Aspzy Github'un Sorunları bölümündeki zzyykk123456'nın ekran görüntülerine başvurabilirsiniz: github.com/aspnet/Home/issues/2202
Chun Lin

Bu benim için çalıştı. Swagger (swashbuckle) kullanarak Content Type: application / json ayarını yapmak ve çift tırnak kullanmak zorundayım.
John Henckel

1
Benim Sorunum Ama Ajax isteklerinde 'veri: JSON.stringify ("YourString")'
Amir Hossein Ahmadi

1
@AmirHosseinAhmadi Ben az önce ajax bu karşılaştım ve aslında kullanarak JSON.stringifybenim [frombody]olmak neden olduğunu gördüm null. Veri alanını bir dize değerine (json dizesi) ayarladıktan sonra çalıştı.
Nexaspx

19

Veri modeli olarak kullanılacak bir sınıf oluşturmayı deneyin, ardından veri modeli sınıfınızın özellikleriyle eşleşen özelliklere sahip bir JSON nesnesi gönderin. (Not: Bunu test ettim ve bugün indirdiğim en yeni MVC 4 RC 2012 ile çalışıyor).

public HttpResponseMessage Post(ValueModel model)
{
    return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}

public class ValueModel
{
    public string Value { get; set; }
}

Aşağıdaki JSON nesnesi HTTP-POST gövdesinde gönderilir, içerik türü application / json

{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }

Bir veri modeli sınıfı oluşturmak zorunda olmanızın nedeni, basit değerlerin url parametrelerinden olduğu ve tek bir karmaşık değerin gövdeden olduğu varsayıldığına inanıyorum. Onlar var [FromBody]ve [FromUrl]niteliklerini, ancak kullanarak[FromBody] string value benim için işe yaramadı hala. Görünüşe göre hala çok fazla hata yapıyorlar, bu yüzden bu gelecekte değişeceğinden eminim.

Düzenleme: Vücutta çalışmak için XML var. Varsayılan XML serileştiricisi XmlSerializer yerine DataContractSerializer olarak değiştirildi. Global.asax dosyama aşağıdaki satırı koymak bu sorunu düzeltti ( başvuru )

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

bu benim için request.ContentType = "application / json; charset = UTF-8" ile çalıştı;
Arvind Krmar

16

Bazı denemelerden sonra, varsayılan davranışın doğru olduğunu ve kesmek için hiçbir şey olmadığını düşünüyorum.

Tek yöntem şudur: posta yöntemi argümanınız aşağıdaki stringgibi ise, gövdede çift ​​tırnak içeren düz bir dize göndermelisiniz (ajax veya postacı kullanırken), ör.

//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
    return "received " + value; //  "received {\"a\":1}"
}

Aksi takdirde, dış çift tırnak işaretleri ve kaçan iç tırnaklar olmadan posta gövdesinde bir json dizesi gönderirseniz , model sınıfına (bağımsız değişken türü) ayrıştırılabilmelidir.{"a":1, "b":2}

public class MyPoco{
    public int a;
    public int b;
}

//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
    return "received " + value.ToString();  //"received your_namespace+MyPoco"
}

11

Birkaç dakika boyunca bu soruna bir çözüm arıyordum, bu yüzden çözümümü paylaşacağım.

Bir model gönderirseniz, modelinizin boş / varsayılan bir kurucuya sahip olması gerekir, aksi takdirde model oluşturulamaz. Yeniden düzenlerken dikkatli olun. ;)


Yeniden düzenleme tam olarak beni burada bitiren şey, bahşiş için teşekkürler!
Alan

10

Bu benim için çalıştı:

  1. JQuery / Ajax'tan geçmek istediğiniz her özellik için bir özelliğe sahip bir C # DTO sınıfı oluşturun

    public class EntityData
    {
        public string Attr1 { get; set; }
        public string Attr2 { get; set; }
    }
  2. Web api yöntemini tanımlayın:

    [HttpPost()]
    public JObject AddNewEntity([FromBody] EntityData entityData)
    {
  3. Web API'sini şu şekilde arayın:

    var entityData = {
        "attr1": "value1",
        "attr2": "value2"
    };
    
    $.ajax({
        type: "POST",
        url: "/api/YOURCONTROLLER/addnewentity",
        async: true,
        cache: false,
        data: JSON.stringify(entityData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            ...
        }
    });

Bunu gönderdiğiniz için teşekkürler, çok sayıda örnek denedim ama bu benim için çalıştı!
Satbir

10

Swagger veya Postman ile aynı sorunu yaşayanlar içinBenim gibi dize olarak basit bir öznitelik iletiyorsanız, "ContentType" belirtilse bile, yine de null değer elde edersiniz.

Sadece geçiyor:

MyValue

Denetleyiciye boş olarak girer.

Ancak geçerseniz:

"MyValue"

Değer doğru olacak.

Alıntılar burada fark yarattı. Tabii ki, bu sadece Swagger ve Postacı için. Örneğin, Angular kullanan bir Frontend uygulamasında bu, çerçeve tarafından otomatik olarak çözülmelidir.



4

Web API yöntemim için istek nesnesi her zaman boş olduğu benzer bir sorun vardı. Denetleyici eylem adı "Get" önekinden beri, Web API bunu bir POST yerine bir HTTP GET olarak ele aldığını fark ettim. Denetleyici eylemini yeniden adlandırdıktan sonra, şimdi amaçlandığı gibi çalışır.


3

Angular ile verileri şu formatta geçirebildim:

 data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }

Ve Web API Denetleyicisinde:

    [HttpPost]
    public Hashtable Post([FromBody]string jsonString)
    {
        IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);
        string username = data["u"];
        string pwd = data["p"];
   ......

Alternatif olarak, ben de böyle JSON verileri gönderebilir:

    data: { PaintingId: 1, Title: "Animal show", Price: 10.50 } 

Ve denetleyicide böyle bir sınıf türünü kabul edin:

    [HttpPost]
    public string POST(Models.PostModel pm)
    {

     ....
    }

Her iki şekilde de çalışır, API'da yerleşik bir ortak sınıfınız varsa JSON yayınlayın, aksi takdirde '=' + JSON.stringify ({..: ..., ..: ...})


3

Benim durumumda sorun parametrenin bir nesne değil, bir dize olmasıydı, ben Newsoft.Json JObject olarak parametre değiştirdi ve çalışıyor.


2

Çizgi ekleme

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

protected void Application_Start()Global.asax.cs içindeki işlev sonuna ASP.NET MVC3 benim için benzer sorunu düzeltti.


Yardım için teşekkürler ama ne yazık ki yardımcı olmadı. Zaten yardımcı olabileceği gibi şu an için hattı tutacağım!
ianrathbone

Sadece aynı sorunları eklemek için ben XML sonrası meydana
ianrathbone

2

Xml Formatter veya JSON Formatter için bir DataContractSerializer kullanıyorsanız , ondan kurtulmanız gerekir. Bu WebApiConfig dosyamda vardı:

public static void Register(HttpConfiguration config)
{
     config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
     );    

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.UseDataContractJsonSerializer = true;
}

Sadece yorum yapıyorum jsonFormatter.UseDataContractJsonSerializer = true;ve girdi parametrem artık boş değil. Bana bir ipucu verdiği için 'Despertar'a teşekkürler.


2

Gönderdiğiniz JSON'dan eminseniz, API'nizi dikkatlice izlemelisiniz:

  1. yükleme Microsoft.AspNet.WebApi.Tracingpaketi
  2. Ekle config.EnableSystemDiagnosticsTracing();yılında WebApiConfigsınıf içi Registeryöntemiyle.

Şimdi Debug çıktısına bakın ve muhtemelen geçersiz ModelState günlük girişi .

Eğer ModelStategeçersiz aşağıdaki özelliklerinden gerçek nedenini bulmak olabilir Errors:

Kimse böyle bir istisnayı bile tahmin edemez:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Hayatımı kurtardın. Model olarak null almak ve paketi kurduktan sonra, JSON'umun doğru biçimde olmadığını gördüm.
Khizar Iqbal

2

Ben parametre olarak null alma sorunu vardı, ama büyük nesnelerle ilgili oldu. Sorunun IIS maksimum uzunluğu ile ilgili olduğu ortaya çıktı. Web.config dosyasında yapılandırılabilir.

  <system.web>
    <httpRuntime targetFramework="4.7" maxRequestLength="1073741824" />
  </system.web>

Web API'sının hatayı neden bastırdığını ve API'larıma boş nesneler gönderdiğini merak ediyorum. Microsoft.AspNet.WebApi.Tracing kullanarak hata buldum.



1

Bunun bu soruya bir cevap olmadığını biliyorum, ama sorunuma bir çözüm ararken karşılaştım.

Benim durumumda, karmaşık tip bağlı değildi ama bir POST yapmıyordum, querystring parametreleri ile bir GET yapıyordum. Çözüm argümana [FromUri] eklemekti:

public class MyController : ApiController
{
    public IEnumerable<MyModel> Get([FromUri] MyComplexType input)
    {
        // input is not null as long as [FromUri] is present in the method arg
    }
}

Bunun nedeni, GET kullanılırken isteğin gövdesinin yok sayılması (ve bazen bir hataya neden olması). Şimdi çalışmasının nedeni şu anda sorgu dizesinde
paramlar geçiriyorsunuz

1

Aynı sorunu Fiddler'de de yaşadım. Zaten Content-Type: application/json; charset=utf-8veya Content-Type: application/jsonistek üstbilgisinde bulundum .

Benim istek gövdesi aynı zamanda bir düz dize oldu ve Fiddler'da ben yazmıştım: {'controller':'ctrl'}. Bu benim POST yönteminde string parametresini yaptı null.

Düzeltme : tırnak işaretleri kullanmayı ve böylece bir dizeyi göstermeyi unutmayın. Yani, yazarak düzelttim "{'controller':'ctrl'}". (Not: JSON yazarken, kesme işaretlerini kullandığınızdan emin olun veya aşağıdaki gibi tırnak işaretlerinden kaçın:) "{\"controller\":\"ctrl\"}".


Aynı şeyi Postacı'da yapmak zorundaydım. Ama bunu Spring servislerini aradığımda yapmama gerek yok. Net tarafında bir sorun gibi görünüyor.
Malcolm McRoberts

1

Ben MVC 6 geçmek basit JSON nesnesi ile başa çıkmak için buldum en basit yolu NewtonSoft jObject gibi post parametresi türünü elde etmektir:

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}

Test ( [FromBody] object body, [FromHeader(Name="Content-Type")] string bodyMediaType), bodyMediaType == "application.json"gövdeyi JObject'e dökmeden önce kontrol etmenin alternatifler için bir fırsat sağladığı için daha iyi çalışabilir .
VladH

1

Benim için en iyi çözüm aşağıdaki gibi tam HTTP gidiyor:

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

ve ardından dizeyi yayın gövdesinde beklediğiniz nesneye serileştirme. Benim için WS_OpenSession, sessionid, user ve key içeren bir sınıftır.

Oradan param nesnesini kullanabilir ve özelliklerine erişebilirsiniz.

Çok etkili.

Bu url'den kaynaklı dedim:

http://bizcoder.com/posting-raw-json-to-web-api


1

Karmaşık türler için Web API, ortam türü biçimlendirici kullanarak ileti gövdesindeki değeri okumaya çalışır.

Lütfen herhangi bir var mı kontrol edin [Serializable] model sınıfınızı süsleyen özelliğe sahip .

Çalışıp çalışmadığını görmek için niteliği kaldırın. Bu benim için çalıştı.


1

Partiye biraz geç kaldım, ancak bir denetleyici kullanırken geçirilen bir NULL değere rastlayan herkes POST isteğinizin önüne "=" ekleyin.

Uygulama / json Content-Type kullandığımda da denetleyici bir NULL değeri geçti . Aşağıdaki "application / x-www-form-urlencoded" İçerik Türü'ne dikkat edin. Ancak API'den gelen dönüş türü "application / json" dur.

 public static string HttpPostRequest(string url, Dictionary<string, string> postParameters)
    {
        string postData = "=";

        foreach (string key in postParameters.Keys)
        {
            postData += HttpUtility.UrlEncode(key) + "="
                  + HttpUtility.UrlEncode(postParameters[key]) + ",";
        }

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        myHttpWebRequest.Method = "POST";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(postData);

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
        myHttpWebRequest.ContentLength = data.Length;

        Stream requestStream = myHttpWebRequest.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, System.Text.Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();
        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }

1

ne tür bir değer göndermek istediğiniz önemli değildir, dize olarak almak için tırnak işaretleri içine alın. Karmaşık tipler için değil.

javascript:

    var myData = null, url = 'api/' + 'Named/' + 'NamedMethod';

    myData = 7;

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = "some sentence";

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = { name: 'person name', age: 21 };

    $http.post(url, "'" + JSON.stringify(myData) + "'")
         .then(function (response) { console.log(response.data); });

    $http.post(url, "'" + angular.toJson(myData) + "'")
         .then(function (response) { console.log(response.data); });

c #:

    public class NamedController : ApiController
    {
        [HttpPost]
        public int NamedMethod([FromBody] string value)
        {
            return value == null ? 1 : 0;
        }
    }

1

[FromBody] ek açıklaması koyarsanız ve yönteminize parametre olarak bir Dto nesneniz varsa ve yine de verileri alamıyorsanız, DTO'nuzun özelliklerine ve alanlarına bakmaya başlayın.

DTO'mun geçersiz olduğu yerde de aynı problem vardı. Bunun nedenlerinden biri, özelliklerden birinin serileştirilemeyen bir nesneye işaret ediyor olmasıydı :( Bu, medya biçimlendiricisinin verileri ayrıştırmamasına neden oluyor. Böylece nesne her zaman boştu.


1

Veri türlerinizi bir kez daha kontrol edin. Dotnet model bağlayıcı bir kayan nokta bir tamsayı dönüştürmez (ve diğer ilgili kavramlar varsayalım). Bu, tüm modelin reddedilmesine neden olacaktır.

Eğer böyle json varsa:

{
    "shoeSize": 10.5
}

ancak c # modeliniz şöyle görünür:

class Shoe{
    public int shoeSize;
}

model bağlayıcı modeli reddeder ve null alırsınız.


1

Buna oldukça geç kaldım ama benzer sorunlar yaşıyordum ve burada bir sürü cevabın üzerinden geçip arka plan elde ettikten bir gün sonra bir veya daha fazla parametreyi bir Web API 2'ye geri geçirmek için en kolay / hafif çözümü buldum. aşağıdaki gibidir:

Bu kurulum için doğru yönlendirme ile bir Web API kontrolör / eylem, bakın değilse bildiği varsayımıyla: https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with -aspnet-web-api / öğretici-your-ilk-web api .

İlk olarak Denetleyici Eylemi, bu çözüm aynı zamanda Newtonsoft.Json kütüphanesini de gerektirir.

[HttpPost]
public string PostProcessData([FromBody]string parameters) {
    if (!String.IsNullOrEmpty(parameters)) {
        JObject json = JObject.Parse(parameters);

        // Code logic below
        // Can access params via json["paramName"].ToString();
    }
    return "";
}

JQuery kullanarak İstemci Tarafı

var dataToSend = JSON.stringify({ param1: "value1", param2: "value2"...});
$.post('/Web_API_URI', { '': dataToSend }).done(function (data) {
     console.debug(data); // returned data from Web API
 });

Bulduğum en önemli sorun, Web API'sına yalnızca tek bir genel parametre gönderdiğinizden ve adının yalnızca değerinin olmadığından emin olmanızdı, { '': dataToSend }aksi takdirde değeriniz sunucu tarafında boş olacaktır.

Bununla, bir JSON yapısında Web API'sına bir veya daha fazla parametre gönderebilirsiniz ve karmaşık verileri işlemek için sunucu tarafında herhangi bir ekstra nesne bildirmeniz gerekmez. JObject ayrıca, parametreleriniz zaman içinde değiştiğinde daha kolay ölçeklenebilirliğe olanak tanıyarak geçirilen tüm parametreler üzerinde dinamik olarak yinelemenize olanak tanır. Umarım bu benim gibi mücadele eden birine yardım eder.


0

Gövdedeki tek bir parametrenin WebAPI'ye doğru iletilmesi bu kodu çalıştırır $.post(url, { '': productId }

Ve eylemde yakalamak [HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]string value)

Anahtar sihirli değer 'değer' kullanmaktır. Aynı zamanda int veya bir ilkel tip olabilir. İçerik türü veya başlık düzeltmeleri ne olursa olsun Mess, bu kodun mvc post action'da çalışmadığıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.