【问题标题】:Call javascript from MVC controller action从 MVC 控制器操作调用 javascript
【发布时间】: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); 
} 

【问题讨论】:

  • 这完全不可能。

标签: javascript asp.net-mvc


【解决方案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 - 我不确定我是否完全理解您的问题 - 我建议您打开一个包含详细信息的新问题,看看 stackoverflow 社区如何提供帮助
    • 谢谢。已经这样做了stackoverflow.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 .NETjint 运行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() 可以这样调用。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-27
            • 1970-01-01
            • 2015-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多