ОТРИМАТИ та POST до тієї самої дії контролера в ASP.NET MVC


90

Я хотів би, щоб одна дія відповіла як на Gets, так і на Posts. Я спробував наступне

[HttpGet]
[HttpPost]
public ActionResult SignIn()

Здається, це не спрацювало. Будь-які пропозиції ?


2
Пояснення проблеми: Дія ігнорується. Кожен атрибут виключає всі інші методи запиту, тому в результаті дія взагалі не приймає жодних методів запиту.
Guffa

В ASP.NET MVC2 та VisualStudio 2010 приклад OP (із "[AcceptVerbs (HttpVerbs.Get)]" тощо) видає помилку компіляції: "Дублювати атрибут AcceptVerbs".
DaveD

4
@Dave Ти робиш [AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]чи [AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]? Я нічого не знаю про ці атрибути, але якщо ви робите другий, можливо, саме тому ви отримуєте цю помилку.
Джаред,

Відповіді:


134

Це можливо за допомогою атрибута AcceptVerbs. Це трохи детальніше, але більш гнучко.

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}

Більше про msdn .


3
Так, але що, якщо метод використовує параметри (наприклад, SignIn (параметри SingInParams) ... для GET, вони беруться з URI (тому [FromUri] має бути вказано), а для POST вони беруться з тіла (так [ FromBody]))
michal.jakubeczy

64

Дії відповідають як GET, так і POST за замовчуванням, тому вам не потрібно нічого вказувати:

public ActionResult SignIn()
{
    //how'd we get here?
    string method = HttpContext.Request.HttpMethod;
    return View();
}

Залежно від ваших потреб, ви все одно можете виконувати різну логіку залежно від HttpMethod, оперуючи значенням HttpContext.Request.HttpMethod.


5
це добре, поки ви не спробуєте використовувати моделі перегляду! в дії post, яку ви зазвичай передаєте в viewmodel, я намагаюся використовувати необов'язковий параметр і встановлюю за замовчуванням значення null, але це не працює.
JBeckton

1
@JBeckton Зазвичай у мене є метод GET, який просто має параметри рядка запиту, SignIn(Guid? UserId)а POST має модель перегляду, SignIn(SomeVM vm)і обидва викликають спільний приватний метод SignInHandleGetPost(...)... який, можливо, вимагає VM, який повинен ініціалізувати метод GET, або необов’язкові параметри, або все, що ви віддаєте перевагу робити для рефакторингу коду, що використовується / для спільного використання.
AaronLS

2
@JBeckton Я щойно спробував це за допомогою зразкового проекту ASP.NET MVC 4.6.1, із цим методом, AccountController.Login(String returnUrl, LoginViewModel model)і він працює нормально. modelє нульовим для GET та ненульовим для POST. Однак [ValidateForgeryToken]потрібно перевизначити, оскільки ValidateForgeryTokenвидає виняток із запитів GET.
Dai

0
[HttpGet]
public ActionResult SignIn()
{
}

[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}

Це не те, що я шукаю, це реалізація MVC за замовчуванням, що має окремі методи для GET і POST через перевантаження функції. Я не новачок у MVC, я намагаюся, щоб дія GET також реагувала на певні події POST на додаток до стандартної дії POST для колекції форм.
Cranialsurge

Тоді вам потрібно слідувати відповіді Курца. Жоден атрибут не обробляє обидва. Якщо ви намагаєтесь мати запити POST, що переходять до різних дій, це неможливо. Ваша дія повинна буде виконати перемикання, яке ви шукаєте.
Джеремі Б.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.