Ajax 从Action方法返回原始对象,并在渲染之前将其转换为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

我正在开发的网站严重依赖于ajax/json和knockout.js。 我想让我的许多控制器返回定制的视图“json对象”,而不用在返回方法时将它们包装在JsonResult中

这意味着我可以轻松地将多个调用组合到一个父对象中,但仍然能够单独调用操作

简化示例:

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