2012-01-27 20 views
7

मैं एक बहु-कदम सेटअप प्रक्रिया है, जहां मैं क्वेरी स्ट्रिंग यूआरएल केवल अगर वे प्रासंगिक हैं के साथ जोड़ दिया तर्क पारित करने के लिए करना चाहते हैं।MVC3 Html.BeginForm - RouteValueDictionary के रूप में तर्क गुजर विफल रहता है

http://localhost:6618/Account/Profile?wizard=true&cats=dogs

@using(Html.BeginForm())

महान काम किया। यह उत्पन्न हुआ: <form action="/Account/Profile?setup=true&amp;cats=dogs" method="post"> यानी यह किसी भी मूल क्वेरी स्ट्रिंग पैरामीटर में POST कार्रवाई में पारित हो गया, और उसके बाद उस नियंत्रक कार्रवाई में मैं चुन सकता था कि कौन से लोग मेरे अगले चरण को पास करने के लिए प्रासंगिक थे, या जोड़ने के लिए रूटवॉल में जोड़कर, एक RedirectToResult।

हालांकि, मुझे स्टाइल उद्देश्यों के लिए मेरे फॉर्म में एक कक्षा असाइन करने की आवश्यकता है।

मैंने कोशिश की:

@using(Html.BeginForm("Profile", "Account", args, FormMethod.Post, new { @class = "mainForm" }))

जो पैदावार:

<form action="/Account/Profile?Count=1&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D" class="mainForm" method="post">

(args एक फिल्टर करने से उत्पन्न हुआ है, और एक RouteValueDictionary है)। विनिर्देश http://msdn.microsoft.com/en-us/library/dd505151.aspx इंगित करता है कि आप सिस्टम.Web.Routing.RouteValueDictionary के साथ तर्क पारित कर सकते हैं।

मैं क्या चाहता हूँ <form action="/Account/Profile?setup=true&amp;cats=dogs" class="mainForm" method="post">

है मैं मैं, new {key = value} बजाय में गुजर तरह कुछ करने के लिए नहीं करना चाहते, क्योंकि वहाँ तर्क का एक उचित मात्रा निर्धारित करने के क्या मैं अगले कदम पर साथ गुजर हो जाएगा उल्लेख करना चाहिए।

यहां क्या करना है इसके बारे में कोई सुझाव?

मैं इस असाधारण सरल कार्य से परेशान हूं, और निश्चित रूप से कुछ स्पष्ट रूप से कुछ याद कर रहा हूं।

+0

शायद इस अन्य पोस्ट में उत्तर थोड़ा सा मदद कर सकता है? http://stackoverflow.com/questions/1219223/asp-net-mvc-getting-html-beginform-to-remember-querystring-params-when-submi – summea

उत्तर

10

आर्ग एक फिल्टर द्वारा उत्पन्न किया गया था, और एक RouteValueDictionary

मुख्य बिंदु है यही कारण है कि यहाँ।

@using(Html.BeginForm(
    "Profile", 
    "Account", 
    args, 
    FormMethod.Post, 
    new RouteValueDictionary(new { @class = "mainForm" }) 
)) 
{ 
    ... 
} 

सूचना अंतिम तर्क: इस मामले में वाकई BeginForm विधि के correct overload उपयोग कर रहे हैं? काम करने के लिए यह IDictionary<string, object> होना चाहिए।

आपके उदाहरण में यह this overload है जो उठाया जाता है। लेकिन चूंकि आप किसी अज्ञात ऑब्जेक्ट के बजाय रूटव्यू पैरामीटर के लिए RouteValueDictionary पास कर रहे हैं, यह गड़बड़ हो जाता है।

तो, आपके पास या तो दोनों मार्गों और HTML गुणों को शब्दकोश या दोनों अज्ञात वस्तुओं के रूप में होना चाहिए।

+0

@ डारिन डिमिट्रोव क्या आप मेरा प्रश्न देख सकते हैं, कुछ समानताएं हैं: http://stackoverflow.com/questions/12142356/send-an-object-as-a-parameter-to-post-action-in-asp-net -एमवीसी 3 – Saeid

+0

आपका समाधान मेरी स्थिति के लिए काम करता है, लेकिन मुझे समझ में नहीं आता कि वर्ग चर से पहले @ चिह्न का उपयोग क्यों किया जाता है। क्या कोई यहां समझा सकता है कि क्या हो रहा है? धन्यवाद। – northben

+0

@ नॉर्थबेन, इसका उपयोग किया जाता है क्योंकि 'कक्षा' सी # में एक आरक्षित कीवर्ड है। आप सी # विनिर्देशन में इसके बारे में अधिक पढ़ सकते हैं: http://msdn.microsoft.com/en-us/library/aa664670.aspx –

0

बस एक विचार है, लेकिन, यहां तक ​​कि एक बहु कदम फार्म के लिए, नहीं तो आप या तो यह सब GET या POST बनाने के लिए का चयन करना चाहते हैं? उपर्युक्त उदाहरण में ... ऐसा लगता है कि आप फॉर्म के साथ POST का उपयोग कर रहे हैं ... लेकिन अभी भी रास्ते में GET का उपयोग करने का प्रयास कर रहे हैं।

क्यों छुपा पोस्ट मूल्यों का उपयोग न करें (HTML INPUTs का उपयोग करके)?

अन्यथा, उपयोगकर्ता मूल्यों को आसानी से बदल सकते हैं, है ना? (हालांकि, इस एप्लिकेशन को कोई फर्क हो सकता है नहीं और यह ज्यादातर विचार के लिए सिर्फ भोजन है।।)

0

तो आप इस अधिभार का उपयोग कर रहे:

http://msdn.microsoft.com/en-us/library/dd460542.aspx

यह args एक सरल बनाने के लिए संभव है कुंजी और मूल्यों के साथ वस्तु? मुझे लगता है कि आपकी समस्या का समाधान हो सकता है।

डॉक्स के अनुसार:

मानकों ऑब्जेक्ट के गुणों का परीक्षण करके प्रतिबिंब के माध्यम से प्राप्त किए गए हैं। यह ऑब्जेक्ट आम तौर पर ऑब्जेक्ट प्रारंभकर्ता वाक्यविन्यास का उपयोग करके बनाया जाता है। - ऐसा लगता है कि यह हो रहा है - यह मार्ग शब्दकोश के गुण प्राप्त करने के लिए प्रतिबिंबों का उपयोग कर रहा है- गुण कुंजी (स्ट्रिंग का संग्रह) और मूल्य (वस्तुओं का संग्रह)

एक और विकल्प का उपयोग नहीं करना होगा एचटीएमएल सहायक और मैन्युअल रूप से फॉर्म टैग बनाएं - हालांकि यह एचटीएमएल हेल्पर्स रखने के उद्देश्य को हरा देगा।

+0

मुझे पहले अपनी पोस्ट में उल्लेख किया जाना चाहिए था - इसमें थोड़ा सा समय लगता है यह निर्धारित करने के लिए तर्क कि मैं वास्तव में तर्क/sanitize/तर्क में जोड़ना चाहता हूं। शायद मुझे एक कस्टम HtmlHelper पीछा करना चाहिए? – Erica

+0

मुझे यकीन नहीं है कि एक कस्टम एचटीएमएल हेल्पर आपको यहां खरीदता है - तर्क कहीं कहीं जाना है। –

4

निम्नलिखित काम करेंगे।

@using (Html.BeginForm("Profile", "Account", new { id=122}, FormMethod.Post, new { @class = "mainForm" })) 

मार्ग मूल्य वस्तु द्वारा बनाई गई है प्रारंभ वाक्य रचना यानी नए {कुंजी = मान}

+0

मुझे यह उल्लेख करना चाहिए था कि मैं ऑब्जेक्ट का उपयोग नहीं करना चाहूंगा, मैं केवल नए {key = value} को वाक्यविन्यास प्रारंभ करना चाहता हूं, क्योंकि यह निर्धारित करने के लिए कि मैं किस पास पास करना चाहता हूं, मेरे कोड में थोड़ा तर्क की आवश्यकता है। – Erica