2013-01-09 34 views
5

में मार्ग मान के लिए जावास्क्रिप्ट चर पारित करना मैं रूट पैरामीटर के रूप में @ url.Action विधि में जावास्क्रिप्ट चर को पास करना चाहता हूं।एमवीसी 3

मैं अपनी क्रिया विधि में रूट पैरामीटर के रूप में स्क्रीनमोड जावास्क्रिप्ट चर को पास करना चाहता हूं।

मेरे पास स्क्रीनमोड एनम संपत्ति के साथ एक दृश्य मॉडल है और इसके आधार पर मैं को अजाक्स में एक क्रिया कॉल करनी चाहिए। मुझे रूट के लिए पैरामीटर के रूप में एक जावास्क्रिप्ट वैरिएबल पास करने की भी आवश्यकता है।

यह वही है जो मैंने कोशिश की और संकलन त्रुटि मिली।

नाम 'screenMode' वर्तमान संदर्भ में मौजूद नहीं है

$("#role-detail-form").submit(function (e) { 

    if ($(this).valid()) { 
    var screenMode = 0; 
    @{ 
    if (Model.ScreenMode == UI.ViewModel.ScreenMode.New) 
    { 
     <text> 
     screenMode =2; 
     </text> 
    } 
    } 
    $.post('@Url.Action("SaveRoleDetail", new { mode=screenMode})', 
      $(this).serialize(), function (data) { 
       $("#role-detail").html(data); 
       $.validator.unobtrusive.parse($("#role-detail")); 
      }); 
     } 
     e.preventDefault(); 
    }); 

मेरे कार्रवाई

public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode) 
    { 
    } 

उत्तर

6

आपको लगता है कि बाहर विभाजित है और अपने आप को क्वेरी स्ट्रिंग का निर्माण करना होगा है, जावास्क्रिप्ट चर को शामिल करने के लिए। हालांकि शायद सबसे अच्छा अभ्यास, आप अपने मॉडल में ScreenMode चर संग्रहीत करना चाहिए, तो यह आपके लिए ध्यान में रखते हुए एक HiddenFor डाल:

कुछ इस तरह है कि तुम क्या जरूरत है:

$.post('@(Url.Action("SaveRoleDetail"))?screenMode=' + screenMode) 

संपादित करें। फिर, जब भी आप जावास्क्रिप्ट में मान बदलते हैं, तो बस छुपा इनपुट के मान को अपडेट करें, इस तरह आपकी एक्शन विधि को केवल दृश्य मॉडल को पैरामीटर के रूप में ले जाना होगा। यदि आप जावास्क्रिप्ट में फॉर्म पोस्ट कर रहे हैं और आप अपने पोस्ट कॉल के भीतर सभी डेटा वापस भेजने के लिए $("#form").serialize() पर कॉल कर सकते हैं।

+0

क्या मैं एजेक्स विधि पोस्ट में इस क्वेरी स्ट्रिंग को पास कर सकता हूं? यूआरएल कैसा दिखता है? स्क्रीन मोड पोस्ट पैरामीटर का हिस्सा होगा या क्वेरी स्ट्रिंग में होगा? –

+0

बेहतर अभी भी, आप स्क्रीन मॉडल को अपने मॉडल में रख सकते हैं, एक छुपा है दृश्य में, फिर यदि आप जावास्क्रिप्ट में अपना मान बदलना चाहते हैं, तो आप बस छिपे हुए इनपुट के मान को अपडेट कर सकते हैं, फिर जब सब कुछ किया जाता है, तो बस करें $ ("# फॉर्म")। serialize() ;, इस तरह आपकी एक्शन विधि को केवल पैरामीटर के रूप में दृश्य मॉडल लेना चाहिए :) – mattytommo

+0

हाँ आप सही हैं। अब मैं छिपे हुए क्षेत्र का उपयोग करता हूं और जावास्क्रिप्ट के साथ अद्यतन करता हूं। क्या आप कृपया इस छिपे हुए फील्ड की जानकारी को अपने उत्तर के हिस्से के रूप में जोड़ सकते हैं। तो यह दूसरों के लिए भी आसानी से दिखाई दे सकता है और उपयोगी होगा :) –

0

आप T4MVC और jQuery का उपयोग करते हैं, तुम क्या कर ActionResult कॉल कर सकते हैं निम्नलिखित:

नियंत्रक में:

public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode) 
{ 
} 

ध्यान में रखते हुए:

$.post("@Url.Action(MVC.Home.SaveRoleDetail())", { viewModel: param1, screenMode: param2) }, function (data) { 

     //Do Work 

    }); 
+1

यदि आप टी 4 एमवीसी और jQuery के लिए एक लिंक जोड़ते हैं तो यह सहायक होगा। तो लोग यहां से आसानी से नेविगेट कर सकते हैं। धन्यवाद –

+0

क्षमा करें, मुझे लिंक याद आया। दोनों Nuget संकुल के रूप में उपलब्ध हैं। टी 4 एमवीसी यहां पाया जा सकता है (http: // t4mvc।codeplex.com/) और jQuery यहां (http://jquery.com/) उम्मीद है कि इससे मदद मिलती है। – lopezbertoni

4

यह भी संभव है एक प्लेस धारक बनाएं और फिर इसे प्रतिस्थापित करें:

var url = '@Url.Action("GetOrderDetails", "Home", new { id = "js-id" })' 
      .replace("js-id", encodeURIComponent(rowId)); 
+0

मैं इस दृष्टिकोण को पसंद करता हूं – Alireza