2013-03-10 125 views
10

我的iPhone客戶端發佈以下json到我的mvc服務。 當從HTML表單發佈數據時,它會自動將表單數據轉換爲UserModel,並將該對象傳遞給我的Create方法,但是當我從iphone發送請求正文中的JSON字符串時,它將返回爲null。Asp.Net mvc,發佈json?

從JSON到Object的轉換最乾淨的解決方案是什麼?

我寧可不爲不同的客戶端創建多個方法,所以我試圖讓iphone和mvc客戶端使用相同的方法。

身體我的要求:

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

我的模型和操作結果

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

只是爲了確認,你想給用戶對象轉換是從JSON命中控制器? – 2013-03-10 01:50:38

+0

您是否註冊了JsonValueProviderFactory(MVC需要能夠解碼JSON發佈數據)?客戶是否指定了正確的ContentType?請參閱http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp-net-mvc3查看附加事項(最高投票答案有清單)。 – 2013-03-10 01:51:59

+0

JSON看起來不正確,「年齡」之後有逗號?另外,年齡值應該是一個整數? (儘管我認爲失敗了,它會使用默認的int值0)。另外,你的HttpPost方法說'Create ActionResult',它不應該是'ActionResult Create'嗎? – Snixtor 2013-03-10 02:00:14

回答

18

您需要將HTTP Header設置爲'application/json',以便MVC知道您已經通過JSON並完成解釋它的工作。

accept: application/json 

在這裏看到更多的信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

UPDATE:使用MVC3和jQuery工作示例代碼

控制器代碼

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

查看代碼

@{ 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

可供下載的代碼:http://github。 com/glennferrie/PostDataMVCSample – 2013-03-10 12:00:51

+2

感謝您的所有努力 – aryaxt 2013-03-10 16:20:42

+1

但accept頭只是告訴服務器客戶端能夠接收什麼。正如其他問題所述,設置內容類型頭文件已足夠:'contentType:「application/json; charset = utf-8」', – Reiner 2017-09-07 09:09:42

5

嘗試改變方法來這看看你名字或姓氏

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

建議應該是評論,而不是答案。 – Snixtor 2013-03-10 02:00:56

+4

我不認爲海報有權評論 – andri 2013-03-10 02:02:25

+1

@andri令人沮喪的限制,但如果情況如此,海報首先需要贏得足夠的聲望。 – Snixtor 2013-03-10 02:13:12

-1

很晚但希望它可以幫助別人。

從JSON到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... 
} 

這樣你得到一個純粹的JSON對象的要求,在您的控制器一起工作。

+0

當我試圖將FormCollection的json從控制器發佈到其他服務。謝謝。 – 2017-07-27 10:02:07

0

我最近想出了一個更簡單的方式發佈JSON,並從我的應用程序中轉換模型。請注意,您必須爲您的控制器創建模型[JsonObject]以獲取值並進行轉換。

請求:

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

型號:

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

服務器端:

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