在控制器中的ActionResult上使用ActionFilter返回JsonResult

时间:2009-11-02 16:16:52

标签: c# asp.net-mvc

我想使用ActionFilter以不同的格式(JavaScript / XML / JSON / HTML)返回控制器的Model(数据)。这是我到目前为止的地方:

ActionFilter:

public class ResultFormatAttribute : ActionFilterAttribute, IResultFilter
{
    void IResultFilter.OnResultExecuting(ResultExecutingContext context)
    {
        var viewResult = context.Result as ViewResult;

        if (viewResult == null) return;

        context.Result = new JsonResult { Data = viewResult.ViewData.Model };
    }
}

它的实施:

[ResultFormat]
public ActionResult Entries(String format)
{
    var dc = new Models.WeblogDataContext();

    var entries = dc.WeblogEntries.Select(e => e);

    return View(entries);
}

调用OnResultExecuting方法,但我没有将Model(数据)返回并格式化为JSON对象。我的控制器只是呈现视图。


更新:我遵循Darin Dimitrov对this question的回答的建议。

3 个答案:

答案 0 :(得分:12)

这就是我想要的:

public class ResultFormatAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext context)
    {
        context.Result = new JsonResult
        {
            Data = ((ViewResult)context.Result).ViewData.Model
        };
    }
}

答案 1 :(得分:1)

您是否尝试使用OnActionExecuted方法而不是OnResultExecuting来实施过滤器代码?有可能在触发后者时,更改结果为时已晚(语义为“好的,我们手头有结果,这个钩子在此处执行此结果之前就已经开火”),但是我现在没有时间去检查MVC来源以确定。

答案 2 :(得分:-1)

你试过了吗?

return Json(entries);

在控制器操作上返回类型为JsonResult?