RedirectToAction с базового контроллера

Я пытался выполнить RedirectToAction(actionResult) с моего базового контроллера, но IntelliSense не показала эту перегрузку. Я обнаружил, что RedirectToAction помещается в каждый частичный класс контроллера T4MVC. Я вроде понимаю, почему это было реализовано именно так... но не лучше ли было бы иметь альтернативную реализацию, которая была бы методом расширения для контроллера? Или есть лучшее решение для моего случая?


person SiberianGuy    schedule 10.06.2012    source источник


Ответы (4)


Сложность в том, что реализация RedirectToAction требует вызова Controller.RedirectToRoute, который является защищенным, а не общедоступным. Следовательно, вы не сможете вызвать его из метода расширения.

Другим недостатком является то, что даже если бы это сработало, вам пришлось бы вызывать this.RedirectToAction(...), а не просто RedirectToAction(...).

person David Ebbo    schedule 29.07.2012

если ты

вроде понял, почему это реализовано именно так...

тогда вы можете реализовать его таким же образом в своем базовом контроллере, и все готово.

    private ActionResult RedirectToAction(ActionResult actionResult)
    {
        var callInfo = actionResult.GetT4MVCResult();
        return RedirectToRoute(callInfo.RouteValueDictionary);
    }
person Shaddix    schedule 11.06.2012
comment
Ага. Я даже мог бы реализовать метод расширения, о котором я говорю в вопросе. Но мне интересно, почему это реализовано именно так: немного странно реализовывать логику, не зависящую от контроллера, в каждый контроллер. - person SiberianGuy; 11.06.2012
comment
Если вы действительно заинтересованы, гораздо лучше спросить Дэвида Эббо непосредственно в списке обсуждений T4MVC — t4mvc.codeplex.com/ обсуждения Я не думаю, что кто-то еще даст вам точный ответ, почему он сделал именно так, а не иначе :) Мы могли обсуждать только плюсы/минусы. - person Shaddix; 11.06.2012

Если вы просто хотите, чтобы IntelliSense работал, вы можете создать собственный метод расширения. Он будет разрешен с более низким приоритетом, чем метод члена класса, предоставляемый разделяемым классом контроллера T4MVC, поэтому он должен участвовать в IntelliSense, но на самом деле компилятор его не затрагивает.

Если вы спрашиваете на более высоком философском уровне «зачем они это сделали?», то, боюсь, мне придется полагаться на настоящих профессионалов.

person sblom    schedule 10.06.2012

Это может помочь. Это ответ, который я дал некоторое время назад, возможно, это то, что вы ищете.

Перенаправления

person mccow002    schedule 28.06.2012