如何从Action Method with Array属性返回Json?

我试图从动作方法返回一些数据作为json。

我有一个员工对象,如下所示:

public class Employee { public int EmployeeID {get; set;} public string FirstName {get; set;} public string LastName {get; set;} //Other irrelevant properties } 

然后我有一个视图模型如下

 public Class EmployeeViewModel { public Employee Supervisor{get; set;} public List Employees } 

我需要返回一个看起来完全像这样的json对象:

 {id: 1, name: John, children: [ {id: 1, name: Joe, children: []}, {id: 1, name: Rob, children: []} ]} 

现在我只需要进入上面的第二级,返回主管和他们的工作人员。

我将如何在我的动作方法中返回这个(我已经将viewModel对象保持水分,我只需要将其作为json返回)。 到目前为止我的问题是children财产没有填充。

你会惊讶于它是多么简单。 只需设置模型对象,以便它们具有正确的属性。 使用您尝试实现的JSON字符串,您不需要视图模型,因为您似乎希望顶级对象包含employee的属性。 而如果使用viewmodel对象,则顶级对象将是视图模型对象,而employee将是该对象的属性。

相反,我认为您希望顶级对象是具有属性列表(子对象)的员工。 子对象也有一个名为children的属性。 哪个可以递归填充。 构建对象是你的责任,但我确实提供了一些带有伪数据的伪代码来帮助你入门。

 public Class Employee { public int EmployeeID {get; set;} public string FirstName {get; set;} public string LastName {get; set;} public List Children {get; set;} } public Class Child { public int ChildID {get; set;} public string FirstName {get; set;} public string LastName {get; set;} public List Children {get; set;{ } 

现在你的行动方法。 你知道你可以回JsonResult吗? 做这个:

 public JsonResult GetJSON() { //Build employee object and add children to list. Something like the following pseudo-code: List childrenList = new List { new Child { ChildID = //some id, FirstName = "Joe", LastName = "Smith" // Add children to list. }, // Add more children to list. } Employee emp = new Employee { EmployeeID = 123, FirstName = "John", LastName = "Doe", Children = childrenList }; Return Json(emp); } 

这个JSON看起来像:

 { "EmployeeID":"123", "FirstName":"John", "LastName":"Doe", "Children":[ { "ChildID":"someid", "FirstName":"Joe", "LastName":"Smith", Children [] }, { etc... } ] } 

如果您不熟悉JSON,那么您应该知道变量和名称周围的引号确保没有任何错误解释。 MVC为您做到了,而且非常好。 它会将employee的list属性转换为JSON数组,而不需要您做任何工作,它将整齐且可读地格式化JSON。

现在使用MVC 3,您也可以模拟绑定到JSON。 如果您使用包含的json对象发出请求,MVC 3将自动将其属性绑定到employee对象。 因此,如果您发布了我上面列出的相同JSON字符串,那么您的操作方法可能如下所示:

 public ActionResult SampleMethod(Employee emp) { //emp would be the same object you sent as JSON earlier and are now sending back :D } 

注意:您可以考虑将Employee更改为Person ,并为其提供名为Children类型为List的属性。 这样你就可以将EmployeeChild类合并为一个。 但自然我看不到你的所有代码,所以也许你有足够的独特属性值得这两个类。