2010-03-17 13 views
10

से अतिरिक्त पैरामीटर्स के साथ पोस्ट एक्शन विधि एएसपीनेट एमवीसी के साथ एक नियंत्रक कार्रवाई में एक फॉर्म पोस्ट करना संभव है जिसमें फॉर्म में पैरामीटर नहीं हैं, लेकिन यूआरएल से?एएसपी.नेट एमवीसी - यूआरएल

उदाहरण के लिए

GroupController में कार्रवाई विधि:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(int idOne, int idTwo, Model model) 
    { ... } 

मार्ग:

"{controller}/{action}/{idOne}/{idTwo}" 

प्रकाशित किया गया था यूआरएल:

/Employee/Show/1/42 

इस उदाहरण में, रूप है पोस्ट किया जा रहा है एक अलग नियंत्रक, मॉडल के पास सही मान है, हालांकि अन्य पैरामीटर में डिफ़ॉल्ट मान हैं 0.

जिस व्यवहार की मैं अपेक्षा कर रहा था वह यह है कि मॉडलबिन्डर यह देखेगा कि मेरे पास दो पैरामीटर हैं जो दिए गए मार्ग से मेल खाते हैं, और वर्तमान को असाइन करते हैं एक जीईटी ऑपरेशन काम करता है उसी तरह पैरामीटर के लिए 1 और 42 के मान।

क्या यह व्यवहार समर्थित नहीं है, या क्या मुझे कुछ याद आ रहा है?

संपादित: स्पष्ट है कि, नियंत्रक Employee के लिए Show दृश्य दिए गए फ़ॉर्म का एक रूप है जो एक अलग नियंत्रक से पोस्ट की जा रही हैं। हम इसे Group पर कॉल कर सकते हैं।

प्रपत्र कार्रवाई URL के रूप में

Html.BeginForm("Create", "Groups") 

इस प्रकार मैं पाया है Html.BeginForm लिए कई अलग अलग भार के कोशिश कर रहा है, जो पैरामीटर केवल मैप की जाती हैं जब प्रपत्र के बाद इस

/Groups/Create/0/0 

प्रपत्र घोषित किया जाता है की तरह लग रहा एक्शन यूआरएल ब्राउजर एड्रेस बार में मौजूदा यूआरएल से मेल खाता है।

तो अगर मैं यूआरएल /Groups/Create/1/42 पर नेविगेट करता हूं तो मेरे पास एक नया फॉर्म होगा। यदि मैं फॉर्म जमा करता हूं, तो URL रूट मान POST कार्रवाई में पास किए जाते हैं।

+2

मैं मार्ग को परिभाषित मॉडल शामिल करने के लिए और बातिल की एक डिफ़ॉल्ट के रूप में स्थापित करने की कोशिश और देखो क्या होता होगा। '{नियंत्रक}/{कार्रवाई}/{idOne}/{idTwo}/{मॉडल}' –

उत्तर

8

यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप <form> तत्व action को रूट मान वाले यूआरएल को इंगित करते हैं। यह HtmlHelper.BeginForm() विस्तार विधि के भार के से एक के साथ संभव हो जाना चाहिए:

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post); 

मुझे पता है कि अगर मैं अपने प्रश्न सब गलत :)

+0

क्रमबद्ध करें। जैसा कि मैंने प्रश्न में कहा है, कार्रवाई के लिए पहले से ही सही मार्ग मान (उदाहरण से 1 और 42) वाला यूआरएल है। समस्या यह है कि जब मैं निष्पादन क्रिया में कदम रखता हूं, तो दोनों मानकों के मान 0 होते हैं। मैंने आपके सुझाव की कोशिश की, लेकिन मान अभी भी 0 – Karl

2

मैं बहुत यकीन है कि आप केवल प्रपत्र डेटा पोस्ट कर सकते हैं कर रहा हूँ मिले हैं फॉर्म के अंदर इनपुट से। क्या आपने URL के फॉर्म इनपुट मानों को बनाने के लिए इस तरह से दृश्य को प्रस्तुत करने पर विचार किया है (शायद एक HTML सहायक के साथ?)।

अद्यतन: यदि आप फॉर्म का उपयोग नहीं करना चाहते हैं, तो विधि हस्ताक्षर के माध्यम से इसे पारित करने के विरोध में ControllerContext.RouteData.Values["idOne"] का उपयोग करें।

+0

फ़ॉर्म के भीतर मैंने रूट मानों के लिए एक क्वेरी बनाई, ViewContext.RouteData.Values ​​[" idOne "], हालांकि अंतिम प्रस्तुत पृष्ठ पर 0 का मान है, न कि मार्ग से मूल्य। वर्तमान URL मार्ग मान को व्यू/आंशिक रूप से प्राप्त करने के लिए कोई और तरीका है? – Karl

+0

यदि आप एक एचटीएमएल सहायक विस्तार का उपयोग करते हैं, तो आप इसे सहायक उदाहरण से खुद को देख पाएंगे। वाक्यविन्यास 'सहायक' देखेंगे। दृश्य Context.RouteData.Values ​​["idOne"] '। वैकल्पिक रूप से, आप उन आईडी मानों को एक दृश्य मॉडल में संग्रहीत कर सकते हैं और इसे इस तरह से देख सकते हैं। –

+0

+1 वही विचार। इसे एचटीएमएल के भीतर छुपे हुए फ़ील्ड के रूप में मूल्यों में क्यों शामिल न करें। बेजिनफॉर्म ("बनाएं", "समूह")? साथ ही, क्या आप एक नया फॉर्म बनाने के लिए 'पोस्टिंग' होना चाहिए? – Ahmad

0

मैं हाल ही में भी इस मुद्दे पर था, और क्योंकि मैं एक अलग रास्ता था, यह डिफ़ॉल्ट मार्ग के लिए मानचित्रण था, खाते में अतिरिक्त मार्ग पैरामीटर है कि मैं में गुजर रहा था लेने के बिना।

तो यह काम कर पाने के लिए जल्दी, मैंने फ़ॉर्म टैग का उपयोग करके फॉर्म लिखा, और आवश्यक कार्रवाई बनाने के लिए @ Url.Action का उपयोग किया।

0

एक बार जब आप अपना निर्माण दृश्य प्राप्त कर लेते हैं, तो आपके रूट मानों को पोस्ट एक्शन में दोबारा पोस्ट करने की आवश्यकता होती है।

तो, एक विकल्प में मार्ग से आने वाली आईडी को पकड़ने के लिए हिडन की एक जोड़ी है। इस तरह, एक बार जब आप फॉर्म पोस्ट करते हैं, तो इसके मान अन्य इनपुट के साथ पोस्ट किए जाते हैं।

0

मुझे एक ही समस्या थी, कॉन्फ़िगरेशन रूट कॉन्फिग ने इस समस्या को हल किया है।

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      ... 
      routes.MapRoute(
      "MyRoute", 
      "{controller}/{action}/{idOne}/{idTwo}", 
      new 
      { 
       controller = "Employee", // as an example 
       action = "Show", 
       idOne = UrlParameter.Optional, 
       idTwo= UrlParameter.Optional 
      }, new { idOne = @"\d{1,5}" }); 

     } 
    } 

... और ... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post)) 

जवाबी कार्रवाई के लिए एक खुलने वाला टैग लिखता है। जब उपयोगकर्ता फॉर्म सबमिट करता है, तो अनुरोध मार्ग लक्ष्य द्वारा संसाधित किया जाएगा। यह सदस्य अधिभारित है। इस सदस्य के बारे में पूरी जानकारी के लिए, सिंटैक्स, उपयोग और उदाहरण सहित, अधिभार सूची में एक नाम पर क्लिक करें।

और यह सब काम करता है

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