Ajax 从Action方法返回原始对象,并在渲染之前将其转换为JsonResult
我正在开发的网站严重依赖于ajax/json和knockout.js。 我想让我的许多控制器返回定制的视图“json对象”,而不用在返回方法时将它们包装在JsonResult中 这意味着我可以轻松地将多个调用组合到一个父对象中,但仍然能够单独调用操作 简化示例:Ajax 从Action方法返回原始对象,并在渲染之前将其转换为JsonResult,ajax,asp.net-mvc,json,asp.net-mvc-4,asp.net-ajax,Ajax,Asp.net Mvc,Json,Asp.net Mvc 4,Asp.net Ajax,我正在开发的网站严重依赖于ajax/json和knockout.js。 我想让我的许多控制器返回定制的视图“json对象”,而不用在返回方法时将它们包装在JsonResult中 这意味着我可以轻松地将多个调用组合到一个父对象中,但仍然能够单独调用操作 简化示例: public object Main(int groupId) { var viewModel = new { Persons = Employees(groupId), Messa
public object Main(int groupId)
{
var viewModel = new
{
Persons = Employees(groupId),
Messages = AllMessages()
};
return viewModel;
}
public object Employees(int groupId)
{
return DatabaseContext.Employees.Where(e => e.GroupId == groupId).ToList();
}
public object AllMessages()
{
return DatabaseContext.Messages.ToList();
}
我希望能够在OnActionExecuted
中捕获返回的对象,并在此时将整个结果包装成最终的JsonResult
结果已经转换为字符串并捕获到ContentResult
中
有什么想法吗?:)谢谢,这方面的一个好方法是为实体调用创建助手方法。或者,如果您已经在某个地方使用了这些方法,那么它们实际上可以充当助手方法。通过这种方式,您可以返回强类型的
消息列表
和员工列表
,还可以返回所需的父对象。然后,您可以拥有返回json对象的各个控制器方法。此外,还可以扩展父视图模型以返回其他字段
父视图模型
助手方法
使用类似于此处定义的帮助器方法的好处在于,您可以对查询应用更多的逻辑,并且不必更改控制器方法中的任何内容
public ParentModel GetMain(int groupId)
{
var viewModel = new ParentModel
{
Persons = Employees(groupId),
Messages = AllMessages()
};
return viewModel;
}
public IEnumerable<Employee> Employees(int groupId)
{
return DatabaseContext.Employees.Where(e => e.GroupId == groupId).ToList();
}
public IEnumerable<Message> AllMessages()
{
return DatabaseContext.Messages.ToList();
}
谢谢你的回答。我不是要解决冯v。因为我喜欢让样板文件尽可能小 最后,我尝试以下方法。目前它似乎运行得很好,但我仍然需要在实际生产中进行测试 如果有人对此有一些(安全)顾虑,我很高兴在评论中听到他们
// BaseController
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var returnType = ((ReflectedActionDescriptor)filterContext.ActionDescriptor).MethodInfo.ReturnType;
// is the returnType not deriving from ActionResult? Automatically wrap it in a JsonResult
if ( !typeof(ActionResult).IsAssignableFrom(returnType) )
{
var result = filterContext.ActionDescriptor.Execute(filterContext, filterContext.ActionParameters);
filterContext.Result = Json( result );
}
}
public ActionResult GetParent(int groupId){
return Json(helperinstance.GetMain());
}
public ActionResult GetEmployees(int groupId){
return Json(helperinstance.Employees());
}
public ActionResult GetMessages(int groupId){
return Json(helperinstance.AllMessages());
}
// BaseController
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var returnType = ((ReflectedActionDescriptor)filterContext.ActionDescriptor).MethodInfo.ReturnType;
// is the returnType not deriving from ActionResult? Automatically wrap it in a JsonResult
if ( !typeof(ActionResult).IsAssignableFrom(returnType) )
{
var result = filterContext.ActionDescriptor.Execute(filterContext, filterContext.ActionParameters);
filterContext.Result = Json( result );
}
}