2008-11-12 4 views
21

क्या मुझे अपनी रूट परिभाषा (जब मैं मार्ग पंजीकृत कर रहा हूं) में HttpVerb बाधा को पंजीकृत करना है, यदि मैंने पहले से ही [AcceptVerbs (..)] विशेषता के साथ अपनी क्रिया विधि को सजाया है?एएसपी.नेट एमवीसी स्वीकृतिवृत्त और मार्गों को पंजीकृत करना

उदाहरण के लिए। मेरे पास यह है।

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection formCollection) 
{ .. } 

क्या मुझे इस मार्ग को उस बाधा के रूप में जोड़ने के लिए रूट में जोड़ने की ज़रूरत है?

उत्तर

33

दोनों के बीच का अंतर निम्न है: मान लें कि प्रश्न में Create विधि HomeController पर है।

AcceptVerbs विशेषता का उपयोग करते हुए मार्ग को प्रभावित नहीं करता। यह वास्तव में कार्रवाई चालक द्वारा उपयोग किया जाता है। यह आपको करने की अनुमति देता है जिसमें नियंत्रक पर एक ही नाम के साथ 2 क्रिया विधियां होती हैं जो प्रत्येक एक अलग HTTP विधि का जवाब देती हैं।

public ActionResult Create(int id) { .. } 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(FormCollection formCollection) { .. } 

तो जब /home/create के लिए एक अनुरोध में आता है, मार्ग से मेल खाते हैं और नियंत्रक के invoker करने के लिए अनुरोध बंद हाथ होगा। तब आवेदक AcceptVerbs विशेषता को देखकर सही विधि का आह्वान करता है।

HttpMethodConstraint मार्ग में का उपयोग करते हुए यह इस तरह मार्ग ही अनुरोध से मेल नहीं होगा कि कर देगा। तो जब /home/create के लिए कोई POST अनुरोध आता है, तो न तो कार्रवाई विधि कहा जाएगा क्योंकि वह मार्ग अनुरोध से मेल नहीं खाएगा। यह संभव है कि एक और मार्ग मिलान करेगा हालांकि अनुरोध। ओवरलैप यहाँ के लिए कारण का

भाग कि रूटिंग ASP.NET 3.5 एसपी 1 की एक विशेषता है और MVC के लिए विशिष्ट नहीं है। एमवीसी रूटिंग का उपयोग करता है, लेकिन राउटिंग का उपयोग गतिशील डेटा द्वारा भी किया जाता है और हम एएसपी.नेट वेब फॉर्म के साथ रूटिंग को एकीकृत करने की योजना बनाते हैं।

+0

@ फिल: मैं AcceptVerbs के आधार पर नियंत्रक के आवेदक को सर्वोत्तम विधि चुनने के बारे में पहले भाग को समझता हूं। मैं दूसरे भाग को समझ नहीं पा रहा हूं। क्या आप कह रहे हैं कि यदि आप HttpMethodConstraint का उपयोग करते हैं, तो यह नहीं पता कि किस विधि का उपयोग करना है? –

+1

नहीं, मैं कह रहा हूं कि एक बाधा का उपयोग करना मतलब है कि मार्ग स्वयं मेल नहीं खाता है। यदि कोई मार्ग मेल नहीं खाता है, तो अनुरोध पहली जगह एमवीसी को सौंप दिया नहीं गया है। – Haacked

+0

@ हैकड - यह पोस्ट पुरानी है, लेकिन इन दोनों तकनीकों के बारे में मेरा कोई प्रश्न है। मैं एमवीसी 3 का उपयोग कर रहा हूं और अपने ऐप के लिए एक जस्टोन एपीआई को एक शानदार तरीके से बनाने की कोशिश कर रहा हूं। इसका मतलब है कि मेरे पास एक ही मार्ग है जिसे 3 क्रियाएं (पोस्ट, पुट, डिलीट) को संभालने की आवश्यकता है - क्या यह रूटिंग स्तर पर बाधा का उपयोग करना बेहतर होगा और मार्गों में केवल 3 अलग-अलग क्रियाएं होंगी ... या बेहतर बनाने के लिए एमवीसी फ्रेमवर्क में एक विशेषता जो कई क्रियाओं को कैप्चर करती है और उन्हें कार्रवाई के लिए तर्क के रूप में पास करती है? –

4

नहीं - बनाएं केवल POST अनुरोधों का जवाब देगा।

आप अलग अलग AcceptVerb गुण, या कोई भी विशेषता है कि अन्य सभी अनुरोधों को पकड़ेगा के साथ एक साथ बनाने के अन्य कार्यान्वयन हो सकता है।

था कि यदि आपके केवल बनाएं विधि, किसी भी प्राप्त (या अन्य गैर-पोस्ट) अनुरोध एक 404.

मैं हुड के नीचे मान में परिणाम होगा यह सब वैसे भी मार्ग इंजन द्वारा किया जा रहा है। [संपादित करें: नहीं, हैकड की पोस्ट देखें]

+1

हाँ - मैं यह सब समझते हैं, लेकिन यह सवाल नहीं है। मार्ग परिभाषा में परिभाषित, HceptpVerb बाधा बनाम AcceptVerb विशेषता के बीच क्या अंतर है? कुछ भी नहीं ... बस अपनी नाव तैरता है? –

1

सबसे पहले इस तरह सजाने:

[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)] 
public virtual object ItemSave(Menu sampleInput) 

तो आप इस तरह मार्ग जोड़ने की जरूरत:

AddRoute(
       "SampleEdit", 
       "Admin/{sampleID}/Edit", 
       new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true }, 
       new { areaID = new IsGuid() }, 
       new { Namespaces = controllerNamespaces } 
      );