Подтвердить что ты не робот

Сообщение и получить с такой же подписью метода

В моем контроллере у меня есть два действия под названием "Друзья". Тот, который выполняется, зависит от того, будет ли он "получать" или "сообщение".

Итак, мои фрагменты кода выглядят примерно так:

// 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" внутри него? Если да, то как это сделать?

4b9b3361

Ответ 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 просто "Удалить".

Не уверен, что это соответствует вашему сценарию, но всегда это делало для меня, когда у меня была такая же проблема.