2017-10-14 101 views
1

我有一个json字符串,我想解析它到asp.net MVC控制器并绑定到我的模型。这是我做到的方式,但它不起作用(操作方法中的book参数变为null)。请帮助将json字符串绑定到asp.net中的模型MVC

下面

是我的JSON字符串

function parseDAta() { 
 
var jsonString = "{\"book\":[{\"id\":\"01\",\"author\":\"j.k.rowling\",\"price\":250,\"available\":true,\"editions\":[{\"id\":\"001\",\"name\":\"2017\"},{\"id\":\"002\",\"name\":\"2018\"}]},{\"id\":\"02\",\"author\":\"carlsom james\",\"price\":500,\"available\":false,\"editions\":null}]}"; 
 
    
 

 
    $.ajax({ 
 
     url: '/book/book', 
 
     type: "POST", 
 
     dataType: "json", 
 
     contentType: "application/json; charset=utf-8", 
 
     data: jsonString, 
 
     success: function (result) { 
 
      console.log('Data received: '); 
 
      console.log(result); 
 
     } 
 
     
 

 
    }); 
 
}

下面

是我的操作方法

[HttpPost] 
 
     public ActionResult book(model book) 
 
     { 
 

 
      return null; 
 

 
     }

下面

是我莫德尔

public class model 
 
    { 
 
     public book[] book { get; set; } 
 

 
    } 
 

 
    public class book 
 
    { 
 
     public string id { get; set; } 
 
     public string availabity { get; set; } 
 
     public string Author { get; set; } 
 
     public int price { get; set; } 
 

 
     public edition[] edition { get; set; } 
 

 
    } 
 

 
    public class edition 
 
    { 
 
     public string name { get; set; } 
 
     public string id { get; set; } 
 
    }

回答

0

DefaultModelBinder无法绑定你的对象,因为它希望像这样的有效载荷:

{"book": {"book":[]}}

因此,JSON应

"{\"book\":{\"book\":[{\"id\":\"01\",\"author\":\"j.k.rowling\",\"price\":250,\"available\":true,\"editions\":[{\"id\":\"001\",\"name\":\"2017\"},{\"id\":\"002\",\"name\":\"2018\"}]},{\"id\":\"02\",\"author\":\"carlsom james\",\"price\":500,\"available\":false,\"editions\":null}]}}"; 

您已经创建将工作,如果操作方法是这样的JSON:

public ActionResult book(book[] book) 
{ 
} 

为了避免有太多的book s此混淆,您可以操作方法的参数更改为:

public ActionResult book(model model) 
{ 
} 

和JSON来:

"{\"model\":{\"book\":[{\"id\":\"01\",\"author\":\"j.k.rowling\",\"price\":250,\"available\":true,\"editions\":[{\"id\":\"001\",\"name\":\"2017\"},{\"id\":\"002\",\"name\":\"2018\"}]},{\"id\":\"02\",\"author\":\"carlsom james\",\"price\":500,\"available\":false,\"editions\":null}]}}"; 

另一种方式来做到这一点是添加FromBody属性像这样的参数:

public ActionResult book([FromBody]model book) 
{ 
} 

你需要添加一个System.Web.Http参考使用此属性。

+0

非常感谢。我只是简单地改变了操作方法,现在它可以正常工作。感谢您的解释。 – Shyamal

+0

非常抱歉,我修复了它 – Shyamal

0
var jsonString = "{\"book\":[{\"id\":\"01\",\"author\":\"j.k.rowling\",\"price\":250,\"available\":true,\"editions\":[{\"id\":\"001\",\"name\":\"2017\"},{\"id\":\"002\",\"name\":\"2018\"}]},{\"id\":\"02\",\"author\":\"carlsom james\",\"price\":500,\"available\":false,\"editions\":null}]}"; 

首先你需要取消转义这将让你在JSON

在JS

var jsonString =unescape("{\"book\":[{\"id\":\"01\",\"author\":\"j.k.rowling\",\"price\":250,\"available\":true,\"editions\":[{\"id\":\"001\",\"name\":\"2017\"},{\"id\":\"002\",\"name\":\"2018\"}]},{\"id\":\"02\",\"author\":\"carlsom james\",\"price\":500,\"available\":false,\"editions\":null}]}"); 
    console.log(jsonString); 
    $.ajax({ 
     url: '/home/book', 
     type: "POST", 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     data: jsonString, 
     success: function (result) { 
      console.log('Data received: '); 
      console.log(result); 
     } 
    }); 

精读的格式troller

 [HttpPost] 
     public ActionResult book(List<book> book) 
     { 
      return null; 
     } 

模式

public class model //No need of this class,you can remove it 
    { 
     public book[] book { get; set; } 

    } 

    public class book 
    { 
     public string id { get; set; } 
     public string availabity { get; set; } 
     public string Author { get; set; } 
     public int price { get; set; } 

     public edition[] edition { get; set; } 

    } 

    public class edition 
    { 
     public string name { get; set; } 
     public string id { get; set; } 
    } 
+1

非常感谢。我按照你的解释做了改变,这是行得通的。感谢您的解释。 – Shyamal