Я пытался выполнить RedirectToAction(actionResult)
с моего базового контроллера, но IntelliSense не показала эту перегрузку. Я обнаружил, что RedirectToAction помещается в каждый частичный класс контроллера T4MVC. Я вроде понимаю, почему это было реализовано именно так... но не лучше ли было бы иметь альтернативную реализацию, которая была бы методом расширения для контроллера? Или есть лучшее решение для моего случая?
RedirectToAction с базового контроллера
Ответы (4)
Сложность в том, что реализация RedirectToAction требует вызова Controller.RedirectToRoute, который является защищенным, а не общедоступным. Следовательно, вы не сможете вызвать его из метода расширения.
Другим недостатком является то, что даже если бы это сработало, вам пришлось бы вызывать this.RedirectToAction(...)
, а не просто RedirectToAction(...)
.
если ты
вроде понял, почему это реализовано именно так...
тогда вы можете реализовать его таким же образом в своем базовом контроллере, и все готово.
private ActionResult RedirectToAction(ActionResult actionResult)
{
var callInfo = actionResult.GetT4MVCResult();
return RedirectToRoute(callInfo.RouteValueDictionary);
}
Если вы просто хотите, чтобы IntelliSense работал, вы можете создать собственный метод расширения. Он будет разрешен с более низким приоритетом, чем метод члена класса, предоставляемый разделяемым классом контроллера T4MVC, поэтому он должен участвовать в IntelliSense, но на самом деле компилятор его не затрагивает.
Если вы спрашиваете на более высоком философском уровне «зачем они это сделали?», то, боюсь, мне придется полагаться на настоящих профессионалов.
Это может помочь. Это ответ, который я дал некоторое время назад, возможно, это то, что вы ищете.