我的WebApi操作方法返回IQueryable,我想通过Asp.Net WebApi(非MVC)中的ActionFilterAttribute修改它(应用分页和过滤)。 我得到了以下线程如何访问传递的模型:
.Net Web API IActionFilter.OnActionExecuted return type
但是如何用其他东西更改/替换整个模型?
答案 0 :(得分:12)
我找到了它!
首先我应该将actionExecutedContext.ActionContext.Response.Content
投射到ObjectContent
(您应该对项目中的System.Net.Http.Formatting.dll
文件有所了解)
之后您可以简单地执行以下操作:
public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
{
IEnumerable model = null;
actionExecutedContext.Response.TryGetContentValue(out model);
if (model != null)
{
IQueryable modelQuery = model.AsQueryable();
//Do your modelQuery modification/replacement
(actionExecutedContext.ActionContext.Response.Content as ObjectContent).Value = modelQuery;
}
base.OnActionExecuted(actionExecutedContext);
}
注意:要使用TryGetContentValue
方法,您需要导入using System.Net.Http;
命名空间,尽管在上述代码中调用此方法并不重要。
:: UPDATE ::
如果您需要更改内容的值类型(例如,返回字符串而不是IQueryable),则无法更改该值。你应该创建一个这样的新内容:
var result = "Something new!";
var oldObjectContent = (actionExecutedContext.ActionContext.Response.Content as ObjectContent);
var newContent = new ObjectContent<string>(result, oldObjectContent.Formatter);
actionExecutedContext.ActionContext.Response.Content = newContent;