Скажем, у меня есть страница с двумя формами, которые предоставляют разные данные на одной странице, один отправляет два идентификатора, а другой отправляет только 1 идентификатор. Они оба отправляются обратно на ту же страницу (сама). Вот как будет выглядеть HTML...
<form method="post">
<select name="regID">
...
</select>
<select name="jobID">
...
</select>
<input type="submit" value="Add">
</form>
<form method="post">
<button name="ID" type="submit" value="@ID">Remove</button>
</form>
Теперь, чтобы обработать первую форму в контроллере, я могу сделать
[HttpPost]
public ActionResult Index(int regID, int jobID)
{
....
}
Однако, если я попытаюсь обработать вторую форму, добавив
[HttpPost]
public ActionResult Index(int ID)
{
....
}
Когда я нажму кнопку "Отправить", я теперь получу ошибку
The current request for action 'Index' on controller type 'UserJobController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Index(Int32) on type careerninja.Controllers.UserJobController
System.Web.Mvc.ActionResult Index(Int32, Int32) on type careerninja.Controllers.UserJobController
Итак, возможно ли в контроллере перегрузить метод [HttpPost] с разными значениями для обработки двух разных наборов данных формы, или это невозможно? Есть ли другое решение, которое я, возможно, не понимаю, чтобы справиться с такой проблемой?
В основном, для второй формы я хочу иметь кнопку "Удалить", которая при нажатии вызывает контроллер для удаления элемента, удаляет элемент и возвращает представление Index().
Я думаю, что улучшение вашего дизайна создаст проблему, с которой у вас больше нет проблемы. Похоже, вы считаете, что все может пройти через ваш метод Index()
, что не так. Переопределение имени метода для поведения того, что делает действие, обычно - это то, как я называю мои методы.
В основном, для второй формы я хочу иметь кнопку "Удалить", которая при нажатии вызывает контроллер для удаления элемента, удаляет элемент и возвращает представление Index().
Поэтому создайте свой метод с именем Remove()
и перенаправьте его на Index()
public ActionResult Remove(int id)
{
// do some work
this.RedirectToAction("Index");
}
Я бы рекомендовал, чтобы ваши имена методов отображали то, что они делают.
public ActionResult Add(int regID, int jobID)
{
// do some work
this.RedirectToAction("Index");
}
Примечание. Это также важный дизайн для пользовательского интерфейса. Когда страница, как правило, выполняет POST на сервере, а затем сервер возвращает HTML, если пользователи решают обновить страницу, обычно будет отображаться всплывающее окно с запросом на повторную передачу данных. Вместо этого в предыдущих примерах была перенаправлена серверная сторона, которая запускает второй запрос как GET и предотвращает появление всплывающего окна при обновлении.