ASP.NET MVC - переопределение действия с разными параметрами

У меня есть контроллер, который наследуется от базового контроллера. Оба имеют действие edit (post), которое принимает два аргумента:

На базовом контроллере:

[HttpPost]
public virtual ActionResult Edit(IdType id, FormCollection form)

И в производном контроллере:

[HttpPost]
public ActionResult Edit(int id, SomeViewModel viewModel)

Если я оставлю это так, я получу исключение, потому что есть неоднозначный вызов. Тем не менее, я не могу использовать override на производном действии, потому что сигнатуры метода не совсем совпадают. Я могу здесь что-нибудь сделать?

2 ответа

Решение

В дополнение к ответу Developer Art, обходной путь будет:

оставьте базовый метод как есть, и в своем производном классе реализуйте базовый метод и аннотируйте его [NonAction]

[NonAction]
public override ActionResult Edit(IdType id, FormCollection form)
{
   // do nothing or throw exception
}

[HttpPost]
public ActionResult Edit(int id, SomeViewModel viewModel)
{
   // your implementation
}

Я бы связал это:

На базовом контроллере:

[HttpPost]
public virtual ActionResult Edit(IdType id, FormCollection form)

И в производном контроллере:

[HttpPost]
public virtual ActionResult Edit(IdType id, FormCollection form)
{
     var newId = //some enum? transform
     var boundModel = UpdateModel(new SomeViewModel(), form);

     return Edit( newId, boundModel );
}

[HttpPost]
public ActionResult Edit(int id, SomeViewModel viewModel)

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

Это все, что вам нужно сделать на базовом контроллере:

добавление виртуального ключевого слова

На производном контроллере:

добавление ключевого слова override

Другие вопросы по тегам