MVC - 在构造函数中重定向

时间:2011-01-25 12:25:46

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-3

我想知道如果需要的话,如何在控制器构造函数中重定向请求?

例如: 在构造函数内部,我需要使用动态值初始化一个对象,在某些情况下我不想这样做,在这种情况下我想重定向到其他地方。 同样,构造函数的其余部分也不会执行“原始跟随操作”。

我该怎么办? 谢谢

编辑#1

最初我用过:

  public override void OnActionExecuting(ActionExecutingContext filterContext) 

我可以重定向到其他控制器/动作/ url,但是稍后我需要更改我的控制器,我在其构造函数中初始化变量并且有一些真正需要重定向请求的代码:P < / p>

我也需要这个,因为OnActionExecuting在控制器构造函数之后执行。 在我的逻辑中,重定向需要在那里完成。

1 个答案:

答案 0 :(得分:48)

在控制器构造函数中执行重定向不是一个好习惯,因为上下文可能未初始化。标准做法是编写自定义操作属性并覆盖OnActionExecuting方法并在其中执行重定向。例如:

public class RedirectingActionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (someConditionIsMet)
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "someOther",
                action = "someAction"
            }));
        }
    }
}

然后使用此属性装饰要重定向的控制器。要非常小心,不要使用此属性修饰要重定向到的控制器,否则您将遇到无限循环。

所以你可以:

[RedirectingAction]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        // This action is never going to execute if the 
        // redirecting condition is met
        return View();
    }
}

public class SomeOtherController : Controller
{
    public ActionResult SomeAction()
    {
        return View();
    }
}