我试图从动作方法返回一些数据作为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<EmployeeViewModel> Employees
}
我需要返回一个看起来完全像这样的json对象:
{id: 1, name: John, children: [
{id: 1, name: Joe, children: []},
{id: 1, name: Rob, children: []}
]}
现在我只需要进入上面的第二级,返回主管及其下属的工作人员。
我如何在我的动作方法中返回这个(我已经将viewModel对象保持水分,我只需要将其作为json返回)。到目前为止,我的问题是children
属性没有填充。
答案 0 :(得分:9)
你会惊讶于这是多么简单。只需设置模型对象,使它们具有正确的属性。使用您尝试实现的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<Child> Children {get; set;}
}
public Class Child
{
public int ChildID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public List<Child> Children {get; set;{
}
现在你的行动方法。你知道你可以退回JsonResult吗?这样做:
public JsonResult GetJSON()
{
//Build employee object and add children to list. Something like the following pseudo-code:
List<Child> childrenList = new List<Child>
{
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
的{{1}}类型的属性。这样您就可以将List<Person>
和Employee
类合并为一个。但自然我看不到你所有的代码,所以也许你有足够的独特属性值得这两个类。