asp.net MVC 3 - citirea încărcăturii POST în metoda paramaterializată a controlorului

am avut

[HttpPost]        
public ActionResult Foo()
{
   //read HTTP payload
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
 ....
}

Volumul util este aplicația/json; a lucrat bine; apoi m-am schimbat

public ActionResult Foo(string thing)
{
....
}

Intenția este să postați la MyController/Foo? Thing = yo Acum nu pot citească sarcina utilă (lungimea este corectă, dar fluxul este gol). Cred că sistemul de control al instalațiilor a mâncat încărcătura utilă în căutarea unor date postare care pot fi mapate la parametrii metodei. Există un fel în care pot opri acest comportament (cu siguranță MVC nu ar fi mâncat o sarcină utilă al cărui tip este marcat ca JSON, ar trebui să se uite doar la datele din formularul post). Munca mea în jurul meu este de a adăuga "lucru" la json, dar nu-mi place foarte mult

0

1 răspunsuri

Încercați să resetați poziția fluxului de intrare înainte de a citi:

public ActionResult Foo(string thing)
{
    Request.InputStream.Position = 0;
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
    ....
}

Acum, dacă vă trimiteți o sarcină utilă application/json , de ce pe Pământul sfânt vă deranjează să citiți direct fluxul de solicitare în loc să definiți și să utilizați un model de vizualizare:

public class MyViewModel
{
    public string Thing { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

și apoi:

public ActionResult Foo(MyViewModel model)
{
   //use the model here 
    ....
}

ASP.NET MVC 3 are un JsonValueProviderFactory încorporat, care vă permite să legați automat cererile JSON la modele. Și dacă utilizați o versiune mai veche, este ușor să adăugați o astfel de fabrica de sine, așa cum Phil Haack ilustrează în postarea pe blog .

0
adăugat
În ceea ce privește "de ce pe pământ ...", în cazul meu nu există vederi sau modele. Apelurile mele sunt toate apelurile AJAX pure. Pur și simplu folosesc partea C a MVC ca un cadru frumos pentru serverul "REST". De asemenea, suportul pentru microsoft json nu este bun pentru tipuri complexe, ci folosesc json.net
adăugat autor pm100, sursa
Request.InputStream.Position = 0; este un răspuns valid.
adăugat autor Max Favilli, sursa