Сообщение и получить с такой же подписью метода
В моем контроллере у меня есть два действия под названием "Друзья". Тот, который выполняется, зависит от того, будет ли он "получать" или "сообщение".
Итак, мои фрагменты кода выглядят примерно так:
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
Однако это не скомпилируется, так как у меня есть два метода с одной и той же сигнатурой (Друзья). Как мне это сделать? Нужно ли мне создавать только одно действие, но различать "get" и "post" внутри него? Если да, то как это сделать?
Ответы
Ответ 1
Переименуйте второй метод на что-то еще, например "Friends_Post", а затем вы можете добавить атрибут [ActionName("Friends")]
ко второму. Таким образом, запросы к действию Friend с POST в качестве типа запроса будут обработаны этим действием.
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[ActionName("Friends")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends_Post()
{
// do some stuff
return View();
}
Ответ 2
Если вам действительно нужна только одна процедура для обработки обоих глаголов, попробуйте следующее:
[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}
Один потенциальный оговорка: я использую версию MVC 2. Не уверен, что это было поддержано в MVC 1. Документация Intellisense для AcceptVerbs должна сообщить вам.
Ответ 3
Попробуйте использовать:
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
Ответ 4
не совсем уверен, что это правильный путь, но я бы использовал бессмысленный параметр для дифференциации сиггов. как:
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends(bool isGet)
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
// do some stuff
return View();
}
Я знаю это уродливое и хакерское, но оно работает.
Ответ 5
Отметить ответ cagdas как ответ, так как он ответил на мой вопрос. Однако, поскольку мне не нравится использовать атрибут ActionName в моем проекте, я использую другое решение. Я просто добавил FormCollection к действию "post" (которое заканчивает тем, что меняет подпись метода).
// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(FormCollection form)
{
// do some stuff
return View();
}
Ответ 6
добавьте в метод Post параметры, которые хотите получить в сообщении. возможно, вот так:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(string friendName, string otherField)
{
// do some stuff
return View();
}
.. или если у вас сложный тип, например:
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(Friend friend)
{
// do some stuff
return View();
}
Изменить:. Было бы предпочтительнее использовать более типизированный подход к получению опубликованных элементов, например, выше.
Ответ 7
Ваши методы действий не могут делать одно и то же, иначе не было бы необходимости писать два метода действий. Итак, если семантика отличается, почему бы и не использовать разные имена для методов действия?
Например, если у вас был метод действия "удалить", а GET просто запрашивает подтверждение, вы можете вызвать метод GET "ConfirmDelete" и метод POST просто "Удалить".
Не уверен, что это соответствует вашему сценарию, но всегда это делало для меня, когда у меня была такая же проблема.