簡體   English   中英

從MVC控制器操作調用javascript

[英]Call javascript from MVC controller action

我可以從MVC控制器操作 (而不是從視圖頁面)調用javascript函數並獲取返回值嗎? 怎么樣?


我需要使用像這里的javascript 從代碼(.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); 
} 

對於剛剛使用標准表單提交(非AJAX)的用戶,還有另一種方法可以在完成操作后觸發一些Javascript / JQuery代碼。

首先,在Model上創建一個字符串屬性。

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

現在,在視圖的Javascript中綁定到您的新模型屬性:

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

現在,在您的視圖中,創建一個Javascript函數,它可以執行您需要執行的操作:

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

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

</script>

最后,在你的控制器動作中,你需要調用這個新的Javascript函數:

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

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

您可以從JavaScript函數調用控制器操作,但反之亦然。 服務器如何知道要定位的客戶端? 服務器只響應請求。

在發送到客戶端的響應中從JavaScript調用控制器操作(使用jQuery JavaScript庫)的示例。

$.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   
           }
       });

是的,使用Javascript結果肯定是可能的:

return JavaScript("Callback()");

您的視圖應引用Javascript:

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

這是遲到的答案,但對其他人有用。 在視圖中使用ViewBag如下:

@Html.Raw("<script>" + ViewBag.DynamicScripts + "</script>")

然后從控制器設置此ViewBag如下:

ViewBag.DynamicScripts = "javascriptFun()";

這將執行JavaScript函數。 但是如果它是ajax調用,則不會執行此函數。 要從ajax回調中調用JavaScript函數,請從控制器返回兩個值,並在ajax回調中寫入成功函數,如下所示:

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

從控制器,您可以返回兩個值,如下所示:

return Json(new { json = jr.Data, value2 = "value2" });

如果我正確理解了這個問題,您希望在Controller中使用JavaScript代碼。 (你的問題很清楚,但是投票和接受的答案都會產生一些疑問)所以:你可以通過使用.NET的System.Windows.Forms.WebBrowser控件執行javascript代碼,以及瀏覽器可以執行的所有操作。 它需要引用System.Windows.Forms,並且交互有點“老派”。 例如:

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 .NETjint來運行javasctipt,或者根據具體情況運行其他解決方案。

關於這個主題的一些相關問題或可能的重復:

將JavaScript引擎嵌入到.NET中

加載DOM並使用.Net執行javascript,服務器端

希望這可以幫助。

您可以通過讓控制器返回一段數據來模仿這種方法,然后您的視圖可以轉換為JavaScript調用。

我們這樣做是為了讓人們使用RESTful URL來共享他們的jquery渲染工作區視圖。

在我們的例子中,我們傳遞一個需要渲染的組件列表,並使用Razor將這些組件轉換回jquery調用。

MVC中的通常/標准方式是你應該在View中調用/調用你的所有顯示,UI,CSS和Javascript,但是沒有規則, 如果你設法這樣做 ,你也可以在Controller中調用它(我看不到的可能性)。

由於您的控制器操作在服務器上執行,並且JavaScript(通常)在客戶端(瀏覽器)上執行,因此這沒有意義。 如果在頁面加載到瀏覽器后默認情況下需要執行某些操作,則可以使用JavaScript的document.OnLoad事件處理程序。

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM