0

我正在开发的网站很大程度上依赖于 ajax/json 和 knockout.js。我希望我的很多控制器返回视图定制的“json 对象”,而不是在返回方法时将它们包装在 JsonResult 中。

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

简化示例:

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然后将整个结果包装在一个 final 中JsonResult

结果已经转换为字符串并被捕获ContentResult

有任何想法吗?:) 谢谢,

4

2 回答 2

1

一个好的方法是为您的实体调用创建辅助方法。或者,如果您已经在某处拥有这些方法,它们实际上可以用作辅助方法。以这种方式,您可以返回强类型列表Messages以及Employees返回所需的父对象。然后,您可以拥有返回 json 对象的单个控制器方法。此外,您可以扩展父视图模型以返回其他字段。

父视图模型

public class ParentModel {
    public Employee Persons {get;set;}
    public Message Messages {get;set;}
}

辅助方法

使用类似于此处定义的辅助方法的好处在于,您可以对查询应用更多逻辑,甚至更多,并且您不必更改控制器方法中的任何内容。

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

控制器方法

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()); 
}
于 2013-04-22T09:38:18.513 回答
0

感谢你的回答。我不会寻求 von 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 );
    }
}
于 2013-04-22T12:51:15.277 回答