ASP.NET MVC:如何创建一个动作filter来输出JSON?
我在ASP.NET MVC的第二天,也是我第一次在SO上请求代码(是的,快捷方式)。
我正在寻找一种方法来创建一个filter,拦截一个Action的当前输出,而不是输出JSON(我知道其他方法,但这是为了帮助我理解filter)。 我想忽略与该操作相关的任何视图,只需抓取ViewData [“Output”],将其转换为JSON并将其发送出客户端。 空白填补:
TestController.cs:
[JSON] public ActionResult Index() { ViewData["Output"] = "This is my output"; return View(); }
JSONFilter.cs:
public override void OnActionExecuting(ActionExecutingContext filterContext) { /* * 1. How to override the View template and set it to null? * ViewResult { ViewName = "" } does not skip the view (/Test/Index) * * 2. Get existing ViewData, convert to JSON and return with appropriate * custom headers */ }
更新:社区答案导致更全面地实施JSON / POXfilter 。
我建议你真正想做的是使用Model而不是任意的ViewData
元素,并覆盖OnActionExecuted
而不是OnActionExecuting
。 这样,您只需在JsonResult
执行之前将结果替换为JsonResult
然后将其呈现给浏览器。
public class JSONAttribute : ActionFilterAttribute { ... public override void OnActionExecuted( ActionExecutedContext filterContext) { var result = new JsonResult(); result.Data = ((ViewResult)filterContext.Result).Model; filterContext.Result = result; } ... } [JSON]public ActionResult Index() { ViewData.Model = "This is my output"; return View(); }
您没有提到仅有条件地返回JSON,因此如果您希望操作每次都返回JSON,为什么不使用:
public JsonResult Index() { var model = new{ foo = "bar" }; return Json(model); }
也许这篇文章可以帮助你正确的方式。 以上post也是一种方法