Asp.net MVC 2, MvcContrib и базовый контроллер с действиями перенаправления

StackOverflow https://stackoverflow.com/questions/2463781

  •  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));.Это могло бы сработать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top