0

我的任务是确保控制器可以根据谁调用相应的 API 返回类似 Json 的响应或视图。为此,我更改了我制作的每个控制器的返回值,以便它们提供JsonResult并且我创建了一个扩展IResultFilter的类。

在由IResultFilter扩展的 OnResultExecuting 方法中,插入了我的实现:我检查了调用的Accept标头,如果它包含text/html我必须将JsonResult转换为ViewResult,仅将 Json主体(其中还包含我在 ViewModel 中不需要的有关调用的其他信息)。但不在控制器中,我无法创建 ViewResult 对象。

我怎样才能做到这一点?

4

1 回答 1

1

在 IResultFilter 中,Result 属性是只读的。但在 IActionFilter 中并非如此。在那里你可以覆盖 Result :

public class TestFilter : Attribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
        var controller = context.Controller as Controller;
        controller.ViewData.Model = ((JsonResult)context.Result).Value;
        context.Result = new ViewResult()
        {
            ViewName = "Test",
            ViewData = controller.ViewData
        };
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {  
    }
}
于 2018-08-28T15:17:11.090 回答