ASP.NET MVC'de aynı Denetleyici Eylemine GET ve POST Gönderme


91

Hem Gets hem de Gönderilere yanıt veren tek bir eylem olmasını istiyorum. Aşağıdakileri denedim

[HttpGet]
[HttpPost]
public ActionResult SignIn()

Bu işe yaramadı. Herhangi bir öneri ?


2
Sorunu açıklamak için: Eylem göz ardı edilir. Her özellik, diğer tüm istek yöntemlerini hariç tutacağından işlem, hiçbir istek yöntemini kabul etmeyecektir.
Guffa

ASP.NET MVC2 ve VisualStudio 2010'da OP'nin örneği ("[AcceptVerbs (HttpVerbs.Get)]", vb. İle) derleme hatası verir: "Yinelenen 'AcceptVerbs' özniteliği".
DaveD

4
@Dave Yapıyor musun [AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]yoksa [AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]? Bu özellikler hakkında hiçbir şey bilmiyorum ama eğer ikinciyi yapıyorsanız, bu hatayı almanın nedeni bu olabilir.
Jared

Yanıtlar:


134

Bu, AcceptVerbs özniteliği kullanılarak mümkündür. Biraz daha ayrıntılı ama daha esnek.

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

Msdn hakkında daha fazla bilgi .


3
Evet, ama ya yöntem parametreler kullanıyorsa (örneğin SignIn (SingInParams parametreleri) ... GET için, bunlar URI'den alınır (bu nedenle [FromUri] belirtilmelidir) ve POST için vücuttan alınır (yani [ FromBody] belirtilmelidir)?
michal.jakubeczy

64

Eylemler varsayılan olarak hem GET'lere hem de POST'lara yanıt verir, bu nedenle hiçbir şey belirtmeniz gerekmez:

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

İhtiyacınıza bağlı olarak, HttpContext.Request.HttpMethod değeri üzerinde çalışarak HttpMethod'a bağlı olarak farklı mantık gerçekleştirebilirsiniz.


5
siz modelleri görüntülemeyi deneyene kadar bu sorun değil! post eyleminde tipik olarak viewmodel'de geçirirsiniz, isteğe bağlı bir parametre kullanmayı denedim ve varsayılan olarak null olarak ayarladım, ancak bu işe yaramıyor.
JBeckton

1
@JBeckton Genellikle sadece sorgu dizesi parametrelerine sahip olan SignIn(Guid? UserId)ve POST'un görünüm modeline sahip olan SignIn(SomeVM vm)ve her ikisi de paylaşılan bir özel yöntemi çağıran bir SignInHandleGetPost(...)GET yöntemim var ... yeniden kullanılabilir / paylaşılan kodu yeniden düzenlemek için.
AaronLS

2
@JBeckton Şimdi ASP.NET MVC 4.6.1 Örnek proje ile denedim, metodu ile AccountController.Login(String returnUrl, LoginViewModel model)ve iyi çalışıyor. modelGET'te boş ve POST'ta boş değil. Ancak , GET isteklerine bir istisna attığından [ValidateForgeryToken]geçersiz kılınması gerekir ValidateForgeryToken.
Dai

0
[HttpGet]
public ActionResult SignIn()
{
}

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

Aradığım şey bu değil, bu, işlev aşırı yüklemesi yoluyla GET ve POST için ayrı yöntemlere sahip olmanın varsayılan MVC uygulamasıdır. MVC'de yeni değilim, GET eyleminin, form koleksiyonu için standart POST eylemine ek olarak belirli POST olaylarına da yanıt vermesini sağlamaya çalışıyorum.
Cranialsurge

O halde Kurts'un cevabını takip etmelisiniz. Hiçbir özellik her ikisini birden ele almaz. POST isteklerinin farklı işlemlere gitmesini sağlamaya çalışıyorsanız, bu mümkün değildir. Eyleminiz, aradığınız geçişi gerçekleştirmelidir.
Jeremy B.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.