Почему это неверно?
{
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, параметр требуется по вашему запросу.