2009-04-07 12 views
47

Denetleyicimde "Arkadaşlar" adlı iki eylem var. Yürüten, "post" a karşı "get" olup olmamasına göre değişir.gönderi ve aynı yöntem imzası ile alın

Yani benim kod parçalarını şöyle görünür: Ben de aynı imza (Arkadaş) ile iki yöntem beri

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

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

Ancak bu derleme değil. Bunu nasıl yaratırım? Sadece bir eylem oluşturmalı mıyım ama içinde "get" ve "post" arasında ayrım yapmalı mıyım? Eğer öyleyse, bunu nasıl yaparım?

cevap

106

İkinci yöntemi "Friends_Post" gibi başka bir adla yeniden adlandırın ve daha sonra ikinciye [ActionName("Friends")] özniteliğini ekleyebilirsiniz. Bu nedenle, Friend türüne yönelik POST ile istek türü istekleri, bu eylem tarafından ele alınacaktır. Doğru yoldur, ama ben sigs ayırt etmek anlamsız bir parametre kullanmak olsaydı

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

MVC 2.0 '[AcceptVerbs (HttpVerbs yana.Get)] '' [HttpGet] 'e kısaltılabilir, aynı diğer REST yöntemleri için de geçerlidir – nimrod

2

tamamen emin. gibi:

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

Çirkin ve hackish olduğunu biliyorum, ama işe yarıyor.

2

Sorgunun yanıtı olarak yanıt cagdas'ın yanıtı olarak işaretleniyor. Ancak, projemde ActionName özniteliğini kullanmayı sevmediğimden farklı bir çözüm kullanıyorum. Ben sadece

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

Gönderilen öğeleri almak için daha yazılan bir yaklaşım kullanmak tercih edilir - bkz. Yanıt –

1

parametreler post almak istediğiniz yayınla yöntemine ekleyin (yöntem imzası değişen biter) "post" eylemine formcollection ekledi.

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

Düzenleme: Eğer böyle bir karmaşık türü, varsa

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(string friendName, string otherField) 
{ 
    // do some stuff 
    return View(); 
} 

..ya: belki böyle almaya bir daha yazmış-yaklaşımını kullanmak tercih olacaktır yayınlanmıştır Yukarıdaki gibi öğeler. Eğer gerçekten sadece her iki fiilleri işlemek için bir rutin istiyorsanız

16

, şunu deneyin:

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

potansiyel bir ihtar: Bu MVC 1. IntelliSense içinde desteklenmiştir olmadığından emin değil MVC salınımını 2. kullanıyorum AcceptVerbs belgeleri size bildirmelidir.

+3

[AcceptVerbs (" Get "," Post ")] yapıcısı AcceptVerbsAttribute (params string [] fiilleri) olarak tanımlandığı için çalışmalıdır. Tidier görünüyor. – jamiebarrow

+0

Teşekkürler! Bundan daha iyisini severim. – mohrtan

0

Eylem yöntemleriniz aynı şeyi yapamaz, aksi halde iki eylem yöntemi yazmanıza gerek kalmaz. Yani, semantikler farklıysa, neden eylem yöntemleri için farklı isimler kullanmıyorsunuz? Eğer bir "delete" eylem yöntemi vardı ve teyit ister sadece GET eğer

Örneğin, GET yöntemini "ConfirmDelete" ve sadece "Sil" POST yöntemini çağırabilir.

Bu, senaryounuza uyup uymadığından emin değil, aynı sorunla karşılaştığımda her zaman benim için yaptı. kullanılarak

4

Dene:

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