20

我想从 wep api actionfilter 返回一个 json 对象。我怎样才能做到这一点?

我可以从动作中返回对象,但我需要在某些条件下从动作过滤器中返回一些数据。

提前致谢。


编辑:1当我更改如下代码时,浏览器仍在加载而没有任何响应并以超时错误结束。

  public class ValidationActionFilter : ActionFilterAttribute
{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {


        var modelState = actionContext.ModelState;
        if (!modelState.IsValid)
        {
            List<string> arr = new List<string>();
            foreach (var key in modelState.Keys)
            {
                var state = modelState[key];
                if (state.Errors.Any())
                {
                    string er = state.Errors.First().ErrorMessage;
                    if (!string.IsNullOrEmpty(er))
                    {
                        arr.Add(er);
                    }
                }
            }               

           var output =  new Result() { Status = Status.Error.ToString(), Data = null, Message = arr };
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, output, actionContext.ControllerContext.Configuration.Formatters.JsonFormatter);
        }     


    }
}
4

3 回答 3

45

您只需要分配响应:

public class MyActionFilterAttribute: ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Response = actionContext.Request.CreateResponse(
            HttpStatusCode.OK, 
            new { foo = "bar" }, 
            actionContext.ControllerContext.Configuration.Formatters.JsonFormatter
        );
    }
}

假设以下控制器动作:

[MyActionFilter]
public string Get()
{
    return "OK";
}

这个自定义动作过滤器将短路动作的执行并直接返回我们提供的响应。

于 2013-06-26T10:40:44.653 回答
1

您可以使用 HttpResponseMessage 来创建这样的响应

var output =  new Result() { Status = Status.Error.ToString(), Data = null, Message = arr };
actionContext.Response = new HttpResponseMessage {
                Content = new StringContent(JsonConvert.SerializeObject(output), Encoding.UTF8, "application/json"),
                StatusCode = HttpStatusCode.OK
            };
于 2020-02-11T12:05:17.397 回答
0

只是把它扔在那里,以防其他人像我一样来到这里并且找不到他们问题的答案:

您可能使用了错误的导入 - 您有 2 个选项:

  • System.Web.Http.Filters
  • System.Web.Mvc(或System.Web.Http.Mvc

此问题由 Troy Dai 提供:为什么我的 ASP.NET Web API ActionFilterAttribute OnActionExecuting 没有触发?

于 2019-04-24T19:34:30.913 回答