2010-07-12 17 views
75

Hem Gönder hem de İletiler için tek bir eylem yanıt vermek istiyorum. Aşağıdaki gibi görünmüyordu ki, bu işe yaramıyor gibi görünmüyordu. Baska öneri ? ihtiyaç bağlıASP.NET MVC'de aynı Denetleyici Eylemine GET ve POST ALMAK

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

yine işletme tarafından HttpMethod bağlı olarak farklı mantık gerçekleştirebilir: Her iki GETler ve yayınlara varsayılan olarak herhangi bir şey belirtmek zorunda kalmamak

+0

Neler işe yaramaz ve nasıl başarısız olur? –

+0

Sorunu açıklamak için: Eylem yok sayılır. Her bir özellik diğer tüm istek yöntemlerini hariç tutacaktır, bu nedenle işlem herhangi bir istek yöntemini kabul etmeyecek şekilde sona erer. – Guffa

+4

Neden EvilRyry'nin cevabı kabul edilmedi? Benim için hile yaptı. –

cevap

0
[HttpGet] 
public ActionResult SignIn() 
{ 
} 

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

Bu benim aradığım şey değil, bu da, işlev aşırı yüklenmesi yoluyla GET ve POST için ayrı yöntemlere sahip varsayılan MVC uygulamasıdır. MVC için 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

+0

O zaman Kurts'un yanıtını takip etmelisin. Hiçbir özellik her ikisini de ele almayacaktır. Farklı eylemlere giden POST istekleri almaya çalışıyorsanız, bu mümkün değildir. Eyleminiz aradığınız değişimi yapmak zorunda kalacaktır. –

56

Eylemler cevap HttpContext.Request.HttpMethod değeri.

+5

Bu, görünüm modellerini kullanmaya çalışana kadar sorun değil! post eyleminde genellikle viewmodel'e geçersiniz, opsiyonel bir param kullanmayı denerim ve null değerine ayarlıyorum ama bu işe yaramaz. – JBeckton

+1

@JBeckton Genellikle, yalnızca '' Giriş (GUID? UserId) '' ve POST '' ViewIn '' (SomeVM vm) 'nin bir görünüm modeline sahip olan ve her ikisi de paylaşılan bir özel yöntem olan' SignInHandleGetPost (...) 'adlı bir sorgu dizgisi olan bir GET yöntemine sahibim. ... VM'yi GET yönteminin başlatması gerektiğini, veya isteğe bağlı param'ları ya da titremeli/paylaşılmış kodu yeniden oluşturmak için ne yapmayı tercih ederseniz edin. – AaronLS

+0

@JBeckton Şimdi ASP.NET MVC 4.6.1 Örnek projesinde, 'AccountController.Login (String returnUrl, LoginViewModel model)' yöntemiyle çalıştım ve gayet iyi çalışıyor. 'model', GET üzerinde null ve POST'ta null olmayan. Ancak ValidateForgeryToken, GET isteklerine bir istisna atar çünkü '[ValidateForgeryToken]' geçersiz kılınmalıdır. – Dai

111

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

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

msdn hakkında daha fazla bilgi.

+0

Evet, ancak yöntem parametreler kullanıyorsa (örn. SignIn (SingInParams parametreleri) ... GET için, URI'den alınır (bu nedenle [FromUri] belirtilmelidir) ve POST için bunlar vücuttan alınır ([FromBody] belirtilmelidir)? – jabko87

+0

Bu kabul edilen cevap olmalıdır. –

İlgili konular