2009-04-07 11 views
47

मेरे नियंत्रक में मेरे पास "मित्र" नामक दो क्रियाएं हैं। जो निष्पादित करता है वह इस पर निर्भर करता है कि यह "पोस्ट" बनाम "पोस्ट" है या नहीं।पोस्ट करें और उसी विधि हस्ताक्षर के साथ प्राप्त करें

तो मेरी कोड के टुकड़े कुछ इस तरह दिखाई:

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

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

हालांकि, इस के बाद से मैं एक ही हस्ताक्षर (दोस्त) के साथ दो तरीकों संकलन नहीं है। मैं इसे बनाने के बारे में कैसे जा सकता हूं? क्या मुझे केवल एक ही क्रिया बनाने की ज़रूरत है, लेकिन इसके अंदर "प्राप्त करें" और "पोस्ट" के बीच अंतर करें? अगर ऐसा है, तो मैं वह कैसे करू?

उत्तर

106

दूसरी विधि को "Friends_Post" जैसे किसी अन्य चीज़ का नाम बदलें और फिर आप दूसरे को [ActionName("Friends")] विशेषता जोड़ सकते हैं। इसलिए अनुरोध प्रकार के रूप में POST के साथ मित्र कार्रवाई के अनुरोध, उस क्रिया द्वारा संभाले जाएंगे।

// 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 के बाद से।प्राप्त करें)] 'को' [HttpGet] 'तक छोटा किया जा सकता है, वही अन्य आरईएसटी विधियों के लिए जाता है – nimrod

2

पूरी तरह यकीन नहीं अगर यह सही तरीका है, लेकिन मैं sigs अंतर करने के लिए एक अर्थहीन पैरामीटर का प्रयोग करेंगे। जैसे:

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

मैं जानता हूँ कि यह बदसूरत और hackish है, लेकिन यह काम करता है।

2

जवाब के रूप में cagdas की प्रतिक्रिया को चिह्नित करने के बाद से यह मेरे प्रश्न का उत्तर दिया। हालांकि, चूंकि मुझे अपनी परियोजना में एक्शननाम विशेषता का उपयोग करना पसंद नहीं है, इसलिए मैं एक अलग समाधान का उपयोग करता हूं। मैं बस "पोस्ट" कार्रवाई (जो विधि हस्ताक्षर बदल रहा समाप्त होता है)

// 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

पोस्ट किए गए आइटम प्राप्त करने के लिए एक और टाइप किए गए दृष्टिकोण का उपयोग करना बेहतर होगा - उत्तर –

1

पोस्ट विधि पैरामीटर पोस्ट में प्राप्त करना चाहते हैं में जोड़ने के लिए FormCollection गयी। शायद इस तरह:

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

..or यदि आप एक जटिल प्रकार, इस तरह है:

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

संपादित करें: प्राप्त करने के लिए यह एक अधिक टाइप किया-दृष्टिकोण का उपयोग के लिए बेहतर होगा तैनात उपरोक्त की तरह आइटम।

16

आप वास्तव में केवल दोनों क्रियाओं को संभालने के लिए एक नियमित चाहते हैं, इस प्रयास करें:

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

एक संभावित चेतावनी: मैं MVC रिहाई 2. सुनिश्चित नहीं हैं कि उपयोग कर रहा हूँ अगर यह MVC 1. Intellisense में समर्थित किया गया AcceptVerbs के लिए प्रलेखन आपको बताना चाहिए।

+3

देखें [AcceptVerbs ("Get", " पोस्ट ")] काम करना चाहिए क्योंकि इसे कन्स्ट्रक्टर को AcceptVerbsAttribute (पैराम स्ट्रिंग [] क्रियाओं के रूप में परिभाषित किया गया है) के रूप में परिभाषित किया गया है। साफ दिखता है। – jamiebarrow

+0

धन्यवाद! मैं इसे बेहतर पसंद करता हूँ। – mohrtan

0

आपकी क्रिया विधियां एक ही काम नहीं कर सकती हैं, अन्यथा दो कार्यवाही विधियों को लिखने की आवश्यकता नहीं होगी। तो यदि अर्थशास्त्र अलग हैं, तो कार्रवाई विधियों के लिए अलग-अलग नामों का उपयोग क्यों न करें?

उदाहरण के लिए, यदि आपके पास "हटाएं" एक्शन विधि है और केवल पुष्टि के लिए पूछता है, तो आप GET विधि "ConfirmDelete" और POST विधि को "हटाएं" कह सकते हैं।

सुनिश्चित नहीं है कि यह आपके परिदृश्य से मेल खाता है, लेकिन जब मुझे एक ही समस्या थी तो यह हमेशा मेरे लिए किया जाता था।

4

उपयोग करके देखें:

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^