2013-03-15 7 views
12

मैं वर्तमान में वीएस -2010 में एएसपी.नेट एमवीसी 3 एप्लीकेशन विकसित कर रहा हूं और मुझे @Url.Action सहायक के साथ कुछ परेशानी हो रही है। मैं जहाँ मैं इस सहायक का उपयोग एक ajax अनुरोध किया है:कई रूट मानों के साथ url.Action सहायक के साथ समस्याएं

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })'; 
$.post(url).success(function(data) { 
    ... 
}); 

समस्या यह है कि इस के बाद url का मूल्य /Controller/Action?a=a&b=b है, मार्ग मूल्यों के बीच & ध्यान दें। यह काम नहीं कर रहा है, लेकिन अगर मैं करता हूं:

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })'.replace('amp;', ''); 

यह पूरी तरह से काम करता है !!!

public JsonResult Action(string a, string b) 
{ 
    ... 
} 

मैं अपने ऐप डिबग है और कार्रवाई बुलाया जाता है और यहां तक ​​कि a"a" है, लेकिन bnull है:

मेरे कार्रवाई कुछ इस तरह है।

क्या यह Url.Action का वांछित व्यवहार है? मुझे ऐसा नहीं लगता। कृपया मेरी मदद करो, मैं क्या गलत कर रहा हूँ? क्या मुझे अपने Url.Action कॉल में एक और पैरामीटर जोड़ना चाहिए? अग्रिम में धन्यवाद।

+0

में मुझे लगता है कि यह Url.Action के साथ कोई समस्या नहीं है बल्कि jQuery यूआरएल आपके यूआरएल को एन्कोड कर रहा है। – Tommy

उत्तर

3

यह आप नहीं हैं। जावास्क्रिप्ट एक संरक्षित चरित्र के रूप में & को दिखाता है और

"यह encodes" आप एक तरह से उसके चारों ओर पाने के लिए मिल गया है, मैं दूसरों को देखा है। चूंकि यह सवाल सबसे अच्छा तरीका नहीं पूछ रहा है, लेकिन यह आप हैं या नहीं, मैं आपको आश्वस्त कर सकता हूं कि यह आपको नहीं है। आपने कुछ भी गलत नहीं किया है। यह जावास्क्रिप्ट का प्राकृतिक व्यवहार है।

यदि हम सबसे अच्छा संपर्क करने पर चर्चा कर रहे हैं, तो मैं केवल अपना यूआरएल प्राप्त करने के लिए @Url.Action का उपयोग करना पसंद करता हूं, और मेरी JQuery विधि पर पैराम के रूप में पैराम पास करने के लिए (एजेक्स विधि मेरा पसंदीदा है)।

उदाहरण e.camper

$.post(url, { a: "a", b: "b"}).success(...) 
+0

तो आप ऐसा कुछ करेंगे: 'var url = '@ url.Action (" action "," नियंत्रक ")'; और फिर' $। पोस्ट (यूआरएल, {ए: "ए", बी: "बी "})। सफलता (...)' ?? – ecampver

+0

@ e.campver, हाँ, यह एक महान उदाहरण है –

+2

मुझे यह अस्वीकार करने से नफरत है कि यह * आप नहीं है, लेकिन वास्तव में आप @ एम्पैम्पवर हैं - आप जेएस तारों के लिए मूल्य उत्पन्न कर रहे हैं, यह ठीक से किया जाना चाहिए: 'var url = '@ HttpUtility.JavaScriptStringEncode (Url.Action ("एक्शन", "कंट्रोलर", नया {ए = "ए", बी = "बी"})'; '। यह भी गलत है कि * जावास्क्रिप्ट & * की पहचान करता है - यह रेजर इंजन है जो 'Url.Action' के परिणाम को आउटपुट करता है, जो 'MvcHtmlString' के विपरीत एक स्ट्रिंग है, इसलिए यह HTML प्रतिक्रिया उत्पन्न करने के बिंदु पर एन्कोड किया गया है। इसे रोकने के लिए 'Html.Raw' का उपयोग करता है, लेकिन क्योंकि हम एक जेएस स्ट्रिंग उत्पन्न कर रहे हैं, हम' JavaScriptStringEncode' का उपयोग करते हैं। – GSerg

2

से उधार की तरह मैं अपने टिप्पणी में उल्लेख किया है, यह एक जावास्क्रिप्ट एन्कोडिंग मुद्दा है। किसी भी UrlDecoding या चरित्र प्रतिस्थापन क्या करने वाले को रोकने के लिए सबसे अच्छा तरीका है एक मार्ग है, जो पैरामीटर है कि आप अपने डिफ़ॉल्ट मार्ग के ऊपर अपने Global.asax फ़ाइल में पारित करने के लिए

routes.MapRoute(
      "MyCustomRoute", 
      "{Controller}/{Action}/{a}/{b}", 
      new {controller = "Controller", action = "Action"} 

इस जगह कोशिश कर रहे हैं से मेल खाता है परिभाषित करने के लिए है।अब, जब आप

var url = '@Url.Action("Action", "Controler", new { a = "a", b = "b" })';

फोन उत्पादन /Controller/Action/a/b

+0

यह एक अजाक्स पोस्ट है, क्या एएसपी.नेट एमवीसी 3 इस तरह के यूआरएल को मैप करने के लिए मार्ग संग्रह का उपयोग करता है? ? – ecampver

+1

जब भी आप एक यूआरएल सहायक कहते हैं, एमवीसी इसे रूटिंग टेबल के माध्यम से चलाएगा और मैच करने का प्रयास करेगा। आपके उदाहरण में, ऐसा प्रतीत होता है कि आप अपने पैरामीटर पास कर रहे हैं यूआरएल का हिस्सा हैं और वास्तविक फॉर्म POST में नहीं है (जो ठीक है और अगर आप सरल आइटम को नियंत्रक पर वापस भेज रहे हैं तो ऐसा करने में कुछ भी गलत नहीं है)। – Tommy

+0

+1 @ टॉमी बहुत बहुत धन्यवाद, मुझे नहीं पता था, मैं इसे ध्यान में रखूंगा;) – ecampver

3

हो जाएगा हर चीज से ऊपर जवाब में कहा जाता है कि महान, मैं जिस तरह से आप ajax अनुरोध भेज रहे हैं के लिए कुछ जोड़ना चाहते हैं, जब आप अतिरिक्त जानकारी भेजने के, की तरह

var url = '@Url.Action("Action", "Controler")'; 
$.post(url,{a:'a',b:'b'}).success(function(data) { 
    ... 
}); 
+0

स्वीकृत उत्तर में मेरी टिप्पणी देखें, वैसे भी, मैं आपको +1 दूंगा;) – ecampver

+0

आह यदि मैंने इसे पहले देखा था तो कभी जवाब नहीं दिया होगा ... – dakait

0

लिए भेज मैं जानता हूँ कि यह एक पुराने सवाल यह है कि चाहते हैं, लेकिन मैं एक ऐसी ही समस्या हुई तो मैं यह कर समाप्त होने:

$.ajax({ 
     type: "Post", 
     url: "@Url.Action("Action", "Controller")", 
     data:{ param1 : "@Model.param1", param2 : "@Model.param2", param3:"@Model.param3",......,param20 : "something" }, 
     success: function (response) { 
      $("#yourDiv").html(response); 
     } 
    }); 

मुझे आशा है कि यह किसी और के लिए उपयोगी हो सकता है।

4

समस्या यह है कि जब आप रेज़र सिंटैक्स का उपयोग कर रहे हैं: @... रेज़र इंजन Url.Action (जो एक स्ट्रिंग है) के परिणाम को एन्कोड कर रहा है, एक MvcHtmlString के रूप में। इसके परिणामस्वरूप एम्पर्सेंड को & के रूप में एन्कोड किया जा रहा है। इस के आसपास पाने के लिए, का उपयोग Html.Raw (मार्कअप है कि इनकोडिंग HTML नहीं देता है।)

var url = '@Html.Raw(Url.Action("Action", "Controller", new { a = "a", b = "b" }))';

में परिणामी: '?/नियंत्रक/कार्रवाई एक = एक & ख = b'

@ के लिए धन्यवाद जीएसर्ग (डेव अल्परोविच के जवाब में टिप्पणी देखें) ... लेकिन वांछित परिणाम जावास्क्रिप्ट एन्कोडिंग नहीं है। HttpUtility.JavaScriptStringEncode("&") का उपयोग '\ u0026'

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