从 MVC 控制器操作调用 javascript

Posted

技术标签:

【中文标题】从 MVC 控制器操作调用 javascript【英文标题】:Call javascript from MVC controller action 【发布时间】:2011-02-12 04:34:56 【问题描述】:

我可以从 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); 
 

【问题讨论】:

这完全不可能。 【参考方案1】:

在 MVC 中通常/标准的方式是你应该在 View 中放置/调用所有显示、UI、CSS 和 Javascript,但是没有规则,你也可以在 Controller 中调用它如果你设法做到了(我认为不可能)。

【讨论】:

【参考方案2】:

您可以从 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 从代码向服务器发出请求,如下所示:function getInitData() var code;代码='返回';代码+='我:API.getProfiles(uids:API.getVariable(key:1280),字段:“照片”)[0]';代码 += ';'; VK.Api.call('execute', 'code': code , onGetInitData); 嗨 Russ,我在 20 个项目的列表下有大量的命令按钮(绑定到相同的操作)。因此,我试图减少命令按钮的数量。我正在寻找通过 javascript 在控制器类中调用操作方法的方法,只是遇到了这个问题。我是否应该使用您给定的技术通过调用动作方法来减少状态,尽管像这样从 JS 而不是多个 commandButtons 方法?谢谢! @Marcos - 我不确定我是否完全理解您的问题 - 我建议您打开一个包含详细信息的新问题,看看 *** 社区如何提供帮助 谢谢。已经这样做了***.com/questions/8204545/… SignalR 怎么样?还是一般的长轮询/网络套接字?那不会提供效果吗?【参考方案3】:

由于您的控制器操作在服务器上执行,而 JavaScript(通常)在客户端(浏览器)上执行,这没有任何意义。如果您需要在页面加载到浏览器后默认执行一些操作,您可以使用 JavaScript 的 document.OnLoad 事件处理程序。

【讨论】:

【参考方案4】:

您可以通过让控制器返回一段数据来模仿这一点,然后您的视图可以将其转换为 JavaScript 调用。

我们这样做是为了允许人们使用 RESTful URL 来共享他们的 jquery 渲染工作区视图。

在我们的例子中,我们传递了一个需要渲染的组件列表,并使用 Razor 将这些组件转换回 jquery 调用。

【讨论】:

【参考方案5】:

是的,绝对可以使用 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

【讨论】:

在网页上显示Callback() 要使用它,您需要使用 jquery ajax 调用来调用控制器操作。【参考方案6】:

如果我正确理解了这个问题,您希望在控制器中包含 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 .NET 或jint 运行javasctipt,或其他解决方案,具体取决于具体情况。

关于这个主题的一些相关问题或可能的重复:

Embedding JavaScript engine into .NET

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

希望这会有所帮助。

【讨论】:

【参考方案7】:

对于那些只使用标准表单提交(非 AJAX)的人,还有另一种方法可以在您的操作完成后触发一些 Javascript/JQuery 代码。

首先,在您的模型上创建一个字符串属性。

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");

【讨论】:

非常好的答案,如果操作成功(例如更新表格),我想显示一个绿色的 toastr 通知,否则返回一个红色的通知,这对我有帮助。【参考方案8】:
<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>

【讨论】:

【参考方案9】:

这是迟到的答案,但对其他人可能有用。 在视图中使用 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" );

【讨论】:

有效的解决方案。谢谢 我测试了这个解决方案。我不相信 javascriptFun() 可以这样调用。

以上是关于从 MVC 控制器操作调用 javascript的主要内容,如果未能解决你的问题,请参考以下文章

MVC如何从视图调用控制器中的动作以返回值

从 MVC 控制器动作调用 APIController 动作

c# Azure MVC 从控制器调用 .Result 检查 blob 是不是存在

从控制器动态渲染动作 - MVC

使用 ASP.NET MVC 4 从控制器调用另一个不同的视图

需要从 MVC 5 中的控制器操作关闭 Jquery UI 对话框