Подтвердить что ты не робот

MVC - перенаправление внутри конструктора

Я хотел бы знать, как я могу перенаправить запрос внутри конструктора контроллера, если мне нужно это сделать?

Например: Внутри конструктора мне нужно инициализировать объект с динамическим значением, в некоторых случаях я не хочу этого делать, и в этом случае я хочу перенаправить в другое место. Точно так же остальная часть конструктора не будет выполнена ни "оригинальное следующее действие".

Как я могу это сделать? Спасибо вам

РЕДАКТИРОВАТЬ № 1

Первоначально я использовал:

  public override void OnActionExecuting(ActionExecutingContext filterContext) 

Там я мог перенаправить на какой-то другой контроллер /action/url, но позже, мне нужно было изменить мой контроллер, где я инициализирую переменную в его конструкторе и имею код, который действительно нуждается в перенаправлении запроса: P

Мне нужно это также потому, что OnActionExecuting выполняет ПОСЛЕ конструктора контроллера. И в моей логике, там нужно сделать перенаправление.

4b9b3361

Ответ 1

Выполнение перенаправления внутри конструктора контроллера не является хорошей практикой, потому что контекст не может быть инициализирован. Стандартная практика заключается в написании настраиваемого атрибута действия и переопределении метода 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();
    }
}