2010-04-25 26 views
12

क्या मैं एमवीसी नियंत्रक कार्रवाई (दृश्य पृष्ठ से नहीं) से जावास्क्रिप्ट फ़ंक्शन को कॉल कर सकता हूं और वापसी मूल्य प्राप्त कर सकता हूं? कैसे?एमवीसी नियंत्रक कार्रवाई से जावास्क्रिप्ट कॉल करें


मैं यहाँ की तरह जावास्क्रिप्ट का उपयोग कर कोड से सर्वर करने के लिए अनुरोध (.cs) बनाने के लिए जरूरत है (लेकिन इस aspx पेज है)

function getInitData() { 
var code; code = 'return {' ; 
code += 'me: API.getProfiles({uids: API.getVariable({key: 1280}), fields: "photo"})[0]'; 
code += '};' 
VK.Api.call('execute', { 'code': code }, onGetInitData); 
} 
+6

यह पूरी तरह असंभव है। – SLaks

उत्तर

11

आप जावास्क्रिप्ट फ़ंक्शन से नियंत्रक कार्रवाई को कॉल कर सकते हैं लेकिन इसके विपरीत नहीं। सर्वर को कैसे पता चलेगा कि किस ग्राहक को लक्षित करना है? सर्वर बस अनुरोधों का जवाब देता है।

क्लाइंट को भेजी गई प्रतिक्रिया में जावास्क्रिप्ट (jQuery जावास्क्रिप्ट लाइब्रेरी का उपयोग करके) से नियंत्रक कार्रवाई को कॉल करने का एक उदाहरण।

$.ajax({ 
      type: "POST", 
      url: "/Controller/Action", // the URL of the controller action method 
      data: null, // optional data 
      success: function(result) { 
       // do something with result 
      },     
      error : function(req, status, error) { 
       // do something with error 
      } 
     }); 
+0

मुझे यहां जावास्क्रिप्ट का उपयोग करके कोड से सर्वर से अनुरोध करने की आवश्यकता है: फ़ंक्शन getInitData() { var कोड; कोड = 'वापसी {'; कोड + = 'मुझे: API.getProfiles ({uids: API.getVariable ({key: 1280}), फ़ील्ड: "फोटो"}) [0]'; कोड + = '};'; VK.Api.call ('execute', {'code': code}, getInitData पर); } –

+0

हाय रसेल, मेरे पास 20 आइटमों की सूची के तहत कमांडबटन (एक ही कार्रवाई के लिए बाध्यकारी) की बड़ी संख्या नहीं है। इस प्रकार मैं कमांडबटन की संख्या को कम करने की कोशिश कर रहा हूं। मैं जावास्क्रिप्ट के माध्यम से नियंत्रक कक्षाओं में एक्शन विधियों को कॉल करने के तरीकों को देख रहा था और बस इस पर आया। क्या मुझे आपके दिए गए टेक्निनक का उपयोग कार्रवाई विधियों को कॉल करके राज्य को कम करने के लिए करना चाहिए, हालांकि एकाधिक कमांड बटन के बजाय जेएस से यह पसंद है? धन्यवाद ! –

+0

@Marcos - मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं कि आपका प्रश्न क्या है - मैं विवरण के साथ एक नया प्रश्न खोलने की सलाह दूंगा और देखें कि स्टैक ओवरफ्लो समुदाय –

0

MVC में हमेशा की तरह/मानक तरीका है कि आपको अपने सभी डिस्प्ले, यूआई, सीएसएस और जावास्क्रिप्ट को व्यू में कॉल/कॉल करना चाहिए, हालांकि इसके लिए कोई नियम नहीं है, यदि आप ऐसा करने में कामयाब होते हैं तो आप इसे कंट्रोलर में भी पर कॉल कर सकते हैं (कुछ मुझे नहीं लगता है की संभावना)।

0

अपने नियंत्रक कार्यों के बाद से सर्वर पर अमल, और जावास्क्रिप्ट (आमतौर पर) ग्राहक (ब्राउज़र) पर निष्पादित, इस मतलब नहीं है। यदि पृष्ठ ब्राउज़र में लोड होने के बाद आपको डिफ़ॉल्ट रूप से होने वाली कुछ कार्रवाइयां की आवश्यकता होती है, तो आप जावास्क्रिप्ट के दस्तावेज़ का उपयोग कर सकते हैं। ऑनलोड ईवेंट हैंडलर।

1

ऐसे तरीके हैं जिनसे आप अपने नियंत्रक को डेटा का एक टुकड़ा वापस कर सकते हैं, जिससे आपका दृश्य जावास्क्रिप्ट कॉल में अनुवाद कर सकता है।

हम ऐसा कुछ करते हैं ताकि लोग अपने jquery-rendered कार्यक्षेत्र दृश्य को साझा करने के लिए रीस्टफुल यूआरएल का उपयोग कर सकें।

हमारे मामले में हम उन घटकों की एक सूची पास करते हैं जिन्हें प्रस्तुत करने की आवश्यकता होती है और इन बैक को jquery कॉल में अनुवाद करने के लिए रेजर का उपयोग करने की आवश्यकता होती है।

11

हाँ, यह निश्चित रूप से संभव है का उपयोग कर जावास्क्रिप्ट परिणाम:

return JavaScript("Callback()"); 

जावास्क्रिप्ट आपके विचार से संदर्भित किया जाना चाहिए:

function Callback(){ 
    // do something where you can call an action method in controller to pass some data via AJAX() request 
} 
+0

यह वेब पेज पर 'कॉलबैक() 'प्रदर्शित करता है। – Imad

1

अगर मैं सही ढंग प्रश्न को समझने के लिए, आप एक जावा स्क्रिप्ट कोड करना चाहते हैं आपके नियंत्रक में। (आपका प्रश्न पर्याप्त स्पष्ट है, लेकिन मतदान और स्वीकृत उत्तर कुछ संदेह फेंक रहे हैं) तो: आप जावास्क्रिप्ट कोड निष्पादित करने के लिए .NET के System.Windows.Forms.WebBrowser नियंत्रण का उपयोग कर ऐसा कर सकते हैं, और ब्राउज़र जो कुछ भी कर सकता है। इसके लिए System.Windows.Forms के संदर्भ की आवश्यकता है, और बातचीत कुछ हद तक "पुराना स्कूल" है। E.g:

void webBrowser1_DocumentCompleted(object sender, 
    WebBrowserDocumentCompletedEventArgs e) 
{ 
    HtmlElement search = webBrowser1.Document.GetElementById("searchInput"); 
    if(search != null) 
    { 
     search.SetAttribute("value", "Superman"); 
     foreach(HtmlElement ele in search.Parent.Children) 
     { 
      if (ele.TagName.ToLower() == "input" && ele.Name.ToLower() == "go") 
      { 
       ele.InvokeMember("click"); 
       break; 
      } 
     } 
    } 
} 

तो शायद आजकल, यह सबसे आसान समाधान नहीं होगा।

दूसरा विकल्प विशिष्ट मामले के आधार पर जावास्क्रिप्ट, या कोई अन्य समाधान चलाने के लिए Javascript .NET या jint का उपयोग करना है।

इस विषय या संभावित डुप्लिकेट पर कुछ संबंधित प्रश्न:

Embedding JavaScript engine into .NET

Load a DOM and Execute javascript, server side, with .Net

आशा इस मदद करता है।

11

उन लोगों के लिए जिन्होंने मानक फॉर्म सबमिट (गैर-AJAX) का उपयोग किया है, आपके कार्य को पूरा करने के बाद कुछ जावास्क्रिप्ट/JQuery कोड को आग लगाने का एक और तरीका है।

सबसे पहले, अपने मॉडल पर एक स्ट्रिंग प्रॉपर्टी बनाएं।

public class MyModel 
{ 
    public string JavascriptToRun { get; set;} 
} 

अब, अपने को देखने के जावास्क्रिप्ट में अपने नए मॉडल संपत्ति को बाँध:

<script type="text/javascript"> 
    @Model.JavascriptToRun 
</script> 

अब, भी अपने विचार में, एक जावास्क्रिप्ट समारोह जो कुछ भी आपको बस इतना करना है कि बनाने के लिए:

<script type="text/javascript"> 
    @Model.JavascriptToRun 

    function ShowErrorPopup() { 
      alert('Sorry, we could not process your order.'); 
    } 

</script> 

अंत में, अपने नियंत्रक कार्रवाई में, आप इस नए जावास्क्रिप्ट समारोह कॉल करने की आवश्यकता:

[HttpPost] 
public ActionResult PurchaseCart(MyModel model) 
{ 
    // Do something useful 
    ... 

    if (success == false) 
    { 
     model.JavascriptToRun= "ShowErrorPopup()"; 
     return View(model); 
    } 
    else 
     return RedirectToAction("Success"); 
} 
+1

महान चिमटा, बहुत बहुत धन्यवाद – smoothumut

0
<script> 
    $(document).ready(function() { 
     var msg = '@ViewBag.ErrorMessage' 
     if (msg.length > 0) 
      OnFailure('Register', msg); 
    }); 

    function OnSuccess(header,Message) { 
     $("#Message_Header").text(header); 
     $("#Message_Text").text(Message); 
     $('#MessageDialog').modal('show'); 
    } 

    function OnFailure(header,error) 
    { 
     $("#Message_Header").text(header); 
     $("#Message_Text").text(error); 
     $('#MessageDialog').modal('show'); 
    } 
</script> 
संबंधित मुद्दे