Asp.net MVC 2, MvcContrib и базовый контроллер с действиями перенаправления - PullRequest
3 голосов
/ 17 марта 2010

У меня есть базовый контроллер, который использует пару дженериков, ничего особенного.

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.) если я вытащу все в контроллер (из базы ), работает просто отлично. Нужно ли мне писать или настраивать какой-то собственный фильтр действий или чего мне не хватает?

1 Ответ

2 голосов
/ 17 марта 2010

Хорошо, теперь, когда я вижу все это, я думаю, что вижу проблему.

MvcContrib определяет, какой контроллер вызывать, исходя из введенного вами лямбда-выражения , а не типа контроллера. Поэтому, когда вы говорите this.RedirectToAction(c => c.FormInfo(viewModel));, он смотрит на лямбда-выражение и делает вывод, что T имеет тип SystemBaseController<TForm, TFormViewModel>, а не SalesFormController.

Что вам, возможно, придется изменить, - изменить базовый класс на SystemBaseController<TForm, TFormViewModel, TController>, чтобы вы могли сказать this.RedirectToAction<TController>(c => c.FormInfo(viewModel));. Это может сработать.

...