GET и POST с тем же именем Action в том же контроллере

Почему это неверно?

{
    public class HomeController : Controller
    {

        [HttpGet]
        public ActionResult Index()
        {
            Some Code--Some Code---Some Code
            return View();
        }

        [HttpPost]
        public ActionResult Index()
        {
            Some Code--Some Code---Some Code
            return View();
        }

    }

Как я могу получить контрольный пакет, который отвечает на одно, когда "getted", а один - "отправлен"?

Ответ 1

Поскольку у вас не может быть двух методов с одинаковыми именем и подписью, вы должны использовать атрибут ActionName :

[HttpGet]
public ActionResult Index()
{
  // your code
  return View();
}

[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost()
{
  // your code
  return View();
}

Также см. "Как метод становится действием"

Ответ 2

Хотя ASP.NET MVC позволит вам иметь два действия с тем же именем,.NET не позволит вам иметь два метода с одной и той же сигнатурой - то есть с тем же именем и параметрами.

Вам нужно будет указать методы по-разному, используя атрибут ActionName, чтобы сообщить ASP.NET MVC, что они фактически являются тем же самым действием.

Тем не менее, если вы говорите о GET и POST, эта проблема, скорее всего, исчезнет, ​​поскольку действие POST будет принимать больше параметров, чем GET, и поэтому может быть различимым.

Итак, вам нужно:

[HttpGet]
public ActionResult ActionName() {...}

[HttpPost, ActionName("ActionName")]
public ActionResult ActionNamePost() {...}

Или

[HttpGet]
public ActionResult ActionName() {...}

[HttpPost]
public ActionResult ActionName(string aParameter) {...}

Ответ 3

Мне нравится принимать сообщение формы для моих POST-действий, даже если мне это не нужно. Для меня это просто похоже на правильную работу, поскольку вы якобы публикуете что-то.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        //Code...
        return View();
    }

    [HttpPost]
    public ActionResult Index(FormCollection form)
    {
        //Code...
        return View();
    }
}

Ответ 4

Чтобы ответить на ваш конкретный вопрос, вы не можете иметь два метода с тем же именем и теми же аргументами в одном классе; использование атрибутов HttpGet и HttpPost не отличает методы.

Чтобы решить эту проблему, я обычно включаю модель представления для формы, которую вы публикуете:

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        Some Code--Some Code---Some Code
        return View();
    }

    [HttpPost]
    public ActionResult Index(formViewModel model)
    {
        do work on model --
        return View();
    }

}

Ответ 5

Невозможно многопользовательское одно и то же имя и один и тот же параметр

    [HttpGet]
    public ActionResult Index()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Index(int id)
    {
        return View();
    }

хотя int int id не используется

Ответ 6

У вас не может быть нескольких действий с тем же именем. Вы можете добавить параметр к одному методу, и это будет действительным. Например:

    public ActionResult Index(int i)
    {
        Some Code--Some Code---Some Code
        return View();
    }

Существует несколько способов сделать действия, которые отличаются только глаголом запроса. Моим любимым и, я думаю, проще всего использовать пакет AttributeRouting. После установки просто добавьте атрибут к вашему методу следующим образом:

  [GET("Resources")]
  public ActionResult Index()
  {
      return View();
  }

  [POST("Resources")]
  public ActionResult Create()
  {
      return RedirectToAction("Index");
  }

В приведенном выше примере методы имеют разные имена, но имя действия в обоих случаях - "Ресурсы". Единственная разница - это глагол запроса.

Пакет можно установить с помощью NuGet следующим образом:

PM > Install-Package AttributeRouting

Если вам не нужна зависимость от пакетов AttributeRouting, вы можете сделать это, написав специальный атрибут селектора действий.

Ответ 7

Вы получили хороший ответ на этот вопрос, но я хочу добавить свои два цента. Вы можете использовать один метод и запросы процесса в соответствии с типом запроса:

public ActionResult Index()
{
    if("GET"==this.HttpContext.Request.RequestType)
    {
        Some Code--Some Code---Some Code for GET
    }
    else if("POST"==this.HttpContext.Request.RequestType)
    {
        Some Code--Some Code---Some Code for POST
    }
    else
    {
        //exception
    }

    return View();
}

Ответ 8

Сегодня я проверил некоторые ресурсы по одному и тому же вопросу и получил очень интересный пример.

Можно вызвать один и тот же метод по протоколу GET и POST, но вам необходимо перегрузить параметры следующим образом:

@using (Ajax.BeginForm("Index", "MyController", ajaxOptions, new { @id = "form-consulta" }))
{
//code
}

Действие:

[ActionName("Index")]
public async Task<ActionResult> IndexAsync(MyModel model)
{
//code
}

По умолчанию метод без явного протокола - GET, но в этом случае есть объявленный параметр, который позволяет методу работать как POST.

Когда выполняется GET, параметр не имеет значения, но когда выполняется POST, параметр требуется по вашему запросу.