MVC3:是否可以在动作本身的代码之外更改结果类型?

Mat*_*ols 3 custom-attributes action-filter asp.net-mvc-3

如果我创建一个返回的ActionResult的控制器的方法,然后在最后调用视图(),有没有办法有一个过滤器(或东西simular)改变从视图()发射到PartialViewResult的的ViewResult根据条件返回的结果在请求中?

很明显,我可以在控制器方法本身中使用返回ViewResult或PartialViewResult的代码,但是这会出现在很多地方,因此它似乎很好地使用了Filter.我尝试在IResultFilter的两个方法中都这样做,并且没有看到输出的变化.

如果这是不可能的,那么我将着眼于建立在我的基地控制器的一些方法被称为像ViewOrPartial,我可以打电话,而不是浏览,但我想寻求更广泛的智慧上的过滤器(或类似的东西)的方式放弃之前.

谢谢,马修

更新:所以看来间现正根据达林的代码是什么我曾试图和什么至少一个区别是,我已经覆盖OnResultExecuting(我还曾试图OnResultExecuted)和Darin的代码覆盖OnActionExecuted.这看起来很奇怪还是我可能忽略了别的东西?我很高兴让它工作,但将它附加到IResultFilter接口似乎更有意义.我将不得不更多地研究这两个接口的意图.

Dar*_*rov 9

对的,这是可能的:

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var result = filterContext.Result;
        var viewResult = result as ViewResult;
        var someValue = filterContext.Controller.ValueProvider.GetValue("someValue");
        if (viewResult != null && someValue != null && someValue.AttemptedValue == "foo")
        {
            // if the controller action returned a view result
            // and the someValue parameter equals foo we replace the 
            // view result initially returned by the action by a 
            // partial view result
            var partialResult = new PartialViewResult();
            partialResult.ViewData.Model = viewResult.Model;
            filterContext.Result = partialResult;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后装饰:

[MyActionFilter]
public ActionResult Foo()
{
    MyViewModel vm = ...
    return View(vm);
}
Run Code Online (Sandbox Code Playgroud)