сообщение и получить с тем же методом подписи


в моем контроллере у меня есть два действия под названием "Друзья". Тот, который выполняется, зависит от того, является ли это "get" или "post".

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

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

7   51   2009-04-07 10:48:23

7 ответов:

переименовать второй метод на что-то еще, как "Friends_Post", а затем вы можете добавить

Если вы действительно хотите, чтобы только одна процедура обрабатывала оба глагола, попробуйте следующее:

[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}

одно потенциальное предостережение: я использую MVC release 2. Не уверен, что это поддерживалось в MVC 1. Документация Intellisense для AcceptVerbs должна сообщить вам об этом.

попробуйте использовать:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

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

// 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();
}

Я знаю, что это некрасиво и халтурно, но это работает.

маркировка ответа 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();
}

добавьте в метод 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();
}

Edit: было бы предпочтительнее использовать более типизированный подход к получению отправленных элементов, как указано выше.

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

например, если у вас был метод действия "удалить" и GET просто запрашивает подтверждение, вы можете вызвать метод GET "ConfirmDelete" и метод POST просто "удалить".

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