2013-03-10 39 views
10

Mein iPhone-Client postet den folgenden JSON zu meinem mvc-Dienst. Beim Veröffentlichen von Daten aus HTML-Formular konvertiert es automatisch Formulardaten in UserModel und übergibt das Objekt an meine Create-Methode, aber wenn ich die JSON-Zeichenfolge im Körper meiner Anfrage aus dem iPhone senden, kommt es als Null zurück.Asp.Net mvc, Beitrag json?

Was wäre die sauberste Lösung für die Konvertierung von JSON zu Object.

Ich lieber nicht mehrere Methoden für verschiedene Clients erstellen, so versuche ich, die gleiche Methode für die Arbeit am iPhone und MVC-Client zu bekommen.

Körper meiner Anfrage:

{ 
    "firstName" : "Some Name", 
    "lastName" : "Some Last Name", 
    "age" : "age" 
} 

My Model und Aktion Ergebnis

public class UserModel 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

[HttpPost] 
public Create ActionResult(UserModel user) 
{ 
    // user is null 
    userStorage.create(user); 
    return SuccessResultForModel(user); 
} 
+0

nur um zu bestätigen, können Sie das Benutzerobjekt umwandeln möchten, dass trifft den Controller von Json? –

+0

Haben Sie die JsonValueProviderFactory registriert (die benötigt wird, damit MVC die JSON-Postdaten dekodieren kann)? Gibt der Client den richtigen ContentType an? Siehe http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp-net-mvc3 für weitere Dinge zu überprüfen (Top-Abstimmung hat die Liste). –

+0

Dass JSON nicht gültig aussieht, gibt es ein Komma nach "Alter"? Auch sollte der Wert für Alter ein int sein? (Obwohl ich denke, dass dies fehlschlägt, wird es einen Standard-Int-Wert von 0 verwenden). Auch Ihre HttpPost-Methode sagt 'Create Actionresult', sollte es nicht' ActionResult Create' sein? – Snixtor

Antwort

18

Sie müssen den HTTP-Header accept auf "application/json" setzen, damit MVC weiß, dass Sie es übergeben JSON und tut die Arbeit, um es zu interpretieren.

accept: application/json 

siehe weitere Informationen hier: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

UPDATE: Arbeitsbeispielcode mit MVC3 und jQuery

-Controller-Code

namespace MvcApplication1.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public JsonResult PostUser(UserModel data) 
     { 
      // test here! 
      Debug.Assert(data != null); 
      return Json(data); 
     } 
    } 

    public class UserModel 
    { 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 
    } 
} 

Code anzeigen

@{ ViewBag.Title = "Index"; } 
<script src="../../Scripts/jquery-1.9.1.min.js"></script> 
<script type="text/javascript"> 
    var sample = {}; 
    sample.postData = function() { 
     $.ajax({ 
      type: "POST", url: "@Url.Action("PostUser")", 
      success: function (data) { alert('data: ' + data); }, 
      data: { "firstName": "Some Name", "lastName": "Some Last Name", "age": "30" }, 
      accept: 'application/json' 
     }); 
    }; 
    $(document).ready(function() { 
     sample.postData(); 
    }); 
</script> 

<h2>Index</h2> 
+0

Code zum Download verfügbar: http: // github. com/glennferrie/PostDataMVCSample –

+2

Danke für die ganze Mühe – aryaxt

+1

Aber die Annahme Header ist nur, um dem Server zu sagen, was der Client erhalten kann. Wie in anderen Fragen beschrieben, ist es ausreichend, den Inhaltstyp header zu setzen: 'contentType:" application/json; charset = utf-8 "', – Reiner

5

Versuchen Sie, die Methode, um dies zu ändern, um zu sehen, ob Sie Vorname bekommen oder Nachname

public Create ActionResult(string FirstName, string LastName) 
+1

Vorschläge sollten Kommentare sein, keine Antworten. – Snixtor

+4

Ich glaube nicht, dass das Plakat das Privileg hat, zu kommentieren – andri

+1

@andri Eine frustrierende Einschränkung, aber wenn das der Fall ist, muss das Plakat zuerst genug Ansehen verdienen. – Snixtor

-1

Spät, aber hoffe, es hilft jemandem.

Was wäre die sauberste Lösung für die Konvertierung von JSON zu Object?

<script src="https://code.jquery.com/jquery-3.1.0.js"></script> 

$.post("http://localhost:52161/Default/PostRawJson/", { json: { 
    "firstName" : "Some Name", 
    "lastName" : "Some Last Name", 
    "age" : "age" 
}}); 


public void PostRawJson(string json) 
{ 
    var person = System.Web.Helpers.Json.Decode(json); 
    person.firstname... 
} 

So kann man ein reines JSON-Objekt bekommen wie gewünscht in Ihrem Controller zu arbeiten.

+0

Das hat mir sehr geholfen, als ich versuchte, json von FormCollection vom Controller zu einem anderen zu posten Bedienung. Vielen Dank. –

0

Ich habe vor kurzem eine viel einfachere Möglichkeit gefunden, ein JSON zu veröffentlichen, mit dem zusätzlichen Schritt der Konvertierung von einem Modell in meiner App. Beachten Sie, dass Sie das Modell [JsonObject] für Ihren Controller erstellen müssen, um die Werte abzurufen und die Konvertierung durchzuführen.

Anfrage:

var model = new MyModel(); 

using (var client = new HttpClient()) 
{ 
    var uri = new Uri("XXXXXXXXX"); 
    var json = new JavaScriptSerializer().Serialize(model); 
    var stringContent = new StringContent(json, Encoding.UTF8, "application/json"); 
    var response = await Client.PutAsync(uri,stringContent).Result; 
    ... 
    ... 
    } 

Modell:

[JsonObject] 
[Serializable] 
public class MyModel 
{ 
    public Decimal Value { get; set; } 
    public string Project { get; set; } 
    public string FilePath { get; set; } 
    public string FileName { get; set; } 
} 

Server-Seite:

[HttpPut]  
public async Task<HttpResponseMessage> PutApi([FromBody]MyModel model) 
{ 
    ... 
    ... 
}