C# 在控制器中的ActionResult上使用ActionFilter返回JsonResult
我想使用ActionFilter以不同的格式(JavaScript/XML/JSON/HTML)返回控制器的模型(数据)。到目前为止,我的情况如下: ActionFilter:C# 在控制器中的ActionResult上使用ActionFilter返回JsonResult,c#,asp.net-mvc,C#,Asp.net Mvc,我想使用ActionFilter以不同的格式(JavaScript/XML/JSON/HTML)返回控制器的模型(数据)。到目前为止,我的情况如下: ActionFilter: public class ResultFormatAttribute : ActionFilterAttribute, IResultFilter { void IResultFilter.OnResultExecuting(ResultExecutingContext context) {
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 };
}
}
以及it的实施:
[ResultFormat]
public ActionResult Entries(String format)
{
var dc = new Models.WeblogDataContext();
var entries = dc.WeblogEntries.Select(e => e);
return View(entries);
}
调用了OnResultExecuting
方法,但我没有得到返回的模型(数据)并将其格式化为JSON对象。我的控制器只是渲染视图。
更新:我正在按照达林·迪米特罗夫的建议回答。您是否尝试过:
return Json(entries);
控制器操作的返回类型为JsonResult?您是否尝试过在
OnActionExecuted
方法中实现过滤代码,而不是OnResultExecuting
?有可能在触发后者时,更改结果已经太迟了(语义是,“好的,我们已经得到了结果,这个钩子在执行这个结果之前就已经触发了”),但我现在没有时间去检查MVC源代码以确定是否正确。这就是我要寻找的:
public class ResultFormatAttribute : ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuted(ActionExecutedContext context)
{
context.Result = new JsonResult
{
Data = ((ViewResult)context.Result).ViewData.Model
};
}
}
IResultFilter.OnResultExecuting返回Void。Json类在该上下文中不可用。