5

我的 WebApi 操作方法返回一个 IQueryable,我想通过 Asp.Net WebApi(非 MVC)中的 ActionFilterAttribute 修改它(应用分页和过滤)。以下线程我得到了如何访问传递的模型:

.Net Web API IActionFilter.OnActionExecuted 返回类型

但是我怎样才能用别的东西改变/替换整个模型呢?

4

1 回答 1

14

我找到了!

首先我应该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;命名空间,尽管在上面的代码中调用此方法并不重要。

:: 更新 ::

如果您需要更改内容的值类型(例如返回字符串而不是 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;
于 2013-05-22T09:52:03.193 回答