ASP.net MVC Можете ли вы перегрузить HttpPost Index ()?

0

Скажем, у меня есть страница с двумя формами, которые предоставляют разные данные на одной странице, один отправляет два идентификатора, а другой отправляет только 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().

Теги:
forms
asp.net-mvc

1 ответ

3
Лучший ответ

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

  • 0
    Redirecttoaction добился цели, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню