Asp.net MVC 2, MvcContrib и базовый контроллер с действиями перенаправления
-
20-09-2019 - |
Вопрос
У меня есть базовый контроллер, который использует пару дженериков, ничего слишком навороченного.
public class SystemBaseController<TForm, TFormViewModel> : Controller
where TForm : class, IForm
where TFormViewModel : class, IViewModel
ладно, ничего особенного.У меня есть метод "CompleteForm", который принимает ViewModel, выглядит примерно так ...
public ActionResult CompleteForm(TFormViewModel viewModel)
{
//does some stuff
return this.RedirectToAction(c => c.FormInfo(viewModel));
}
Проблема в том, что контроллер, который наследует это, примерно так
public class SalesFormController : SystemBaseController<SalesForm, SalesViewModel>
{ }
В итоге я получаю сообщение об ошибке от MvcContrib - Имя контроллера должно заканчиваться на 'Controller' на данный момент ...
public RedirectToRouteResult(Expression<Action<T>> expression)
: this(expression, expr => Microsoft.Web.Mvc.Internal.ExpressionHelper.GetRouteValuesFromExpression(expr)) {}
Переданное выражение правильное (SystemBaseController бла-бла-бла), но я не уверен, почему оно 1.) говорит, что в конце нет контроллера, и 2.) если я извлекаю все в контроллер (из базы), работает просто отлично.Нужно ли мне написать или настроить какой-то собственный фильтр действий или чего мне не хватает?
Решение
Хорошо, теперь, когда я вижу все это написанным, я думаю, что вижу проблему.
MvcContrib определяет, какой контроллер вызывать, делая вывод из лямбда - выражение который вы передали, а не тип контроллера.Поэтому, когда вы говорите this.RedirectToAction(c => c.FormInfo(viewModel));
, он просматривает лямбда - выражение и делает вывод , что T имеет тип SystemBaseController<TForm, TFormViewModel>
, а не SalesFormController.
Что вам, возможно, придется сделать, это изменить ваш базовый класс на SystemBaseController<TForm, TFormViewModel, TController>
чтобы вы могли сказать this.RedirectToAction<TController>(c => c.FormInfo(viewModel));
.Это могло бы сработать.