【问题标题】:How to Call Controller Actions using JQuery in ASP.NET MVC如何在 ASP.NET MVC 中使用 JQuery 调用控制器操作
【发布时间】:2011-09-01 10:10:08
【问题描述】:

我已经阅读了一段时间,发现您可以通过以下方式调用控制器操作:

$.ajax("MyController/MyAction", function(data) {
    alert(data);
});

这是否意味着我应该将 MicrosoftMvcAjax.js 或 MicrosoftAjax.js 与 Jquery 库一起添加?

另外,$.ajax() 函数中的第二个参数应该包含什么?

最后,stackoverflow 中或站点外部的任何其他链接可能对 asp.net mvc w/ajax 和 jquery 有帮助吗?

谢谢。

【问题讨论】:

    标签: jquery asp.net-mvc ajax


    【解决方案1】:

    你可以从这里开始阅读jQuery.ajax()

    实际上Controller Action是一个可以通过Url访问的公共方法。因此,可以从 Ajax 调用(MicrosoftMvcAjax 或 jQuery)中调用任何 Action。对我来说,jQuery 是最简单的。我在上面给出的链接中有很多例子。 ajax 调用的典型例子是这样的。

    $.ajax({
        // edit to add steve's suggestion.
        //url: "/ControllerName/ActionName",
        url: '<%= Url.Action("ActionName", "ControllerName") %>',
        success: function(data) {
             // your data could be a View or Json or what ever you returned in your action method 
             // parse your data here
             alert(data);
        }
    });
    

    更多例子可以在here找到

    【讨论】:

    • 我发现如果您使用剃须刀,那么如果您更改路由等,请将 url: "/ControllerName/ActionName" 替换为 url: "@Url.Action("ControllerName","ActionName") 会更好..
    • @steve:好点子,即使不在剃须刀中,您仍然可以像 &lt;%: Url.Action("ActionName", "ControllerName") %&gt; 那样做
    【解决方案2】:

    前面的响应是 ASP.NET only

    您需要对 jquery 的引用(可能来自 CDN):http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js

    然后是类似的代码块,但更简单......

    $.ajax({ url: '/Controller/Action/Id',
             success: function(data) { alert(data); }, 
             statusCode : {
                 404: function(content) { alert('cannot find resource'); },
                 500: function(content) { alert('internal server error'); }
             }, 
             error: function(req, status, errorObj) {
                   // handle status === "timeout"
                   // handle other errors
             }
    });
    

    我添加了一些必要的处理程序,如果您正在调试代码,404 和 500 会一直发生。还有很多其他的错误,比如超时,都会通过错误处理器过滤掉。

    ASP.NET MVC 控制器处理请求,因此您只需要请求正确的 URL,控制器就会接收它。此代码示例适用于 ASP.NET 以外的环境

    【讨论】:

    • 代码中的 505(不支持版本)应该是 500(内部服务器错误)
    【解决方案3】:

    我们可以很方便地使用Javascript/Jquery调用Controller方法,如下:

    假设以下是要调用的 Controller 方法,该方法返回一些类对象的数组。设类为'A'

    public JsonResult SubMenu_Click(string param1, string param2)
    
        {
           A[] arr = null;
            try
            {
                Processing...
               Get Result and fill arr.
    
            }
            catch { }
    
    
            return Json(arr , JsonRequestBehavior.AllowGet);
    
        }
    

    下面是复杂类型(类)

     public class A
     {
    
      public string property1 {get ; set ;}
    
      public string property2 {get ; set ;}
    
     }
    

    现在轮到 JQUERY 调用上面的控制器方法了。以下是调用控制器方法的Jquery函数。

    function callControllerMethod(value1 , value2) {
        var strMethodUrl = '@Url.Action("SubMenu_Click", "Home")?param1=value1 &param2=value2'
        $.getJSON(strMethodUrl, receieveResponse);
    }
    
    
    function receieveResponse(response) {
    
        if (response != null) {
            for (var i = 0; i < response.length; i++) {
               alert(response[i].property1);
            }
        }
    }
    

    在上面的 Jquery 函数 'callControllerMethod' 中,我们开发了控制器方法 url 并将其放在一个名为 'strMehodUrl' 的变量中,并调用 Jquery API 的 getJSON 方法。

    receieveResponse 是接收控制器方法的响应或返回值的回调函数。

    这里我们使用了 JSON ,因为我们不能使用 C# 类对象

    直接进入javascript函数,所以我们将controller方法中的结果(arr)转换成JSON对象如下:

    Json(arr , JsonRequestBehavior.AllowGet);
    

    并返回该 Json 对象。

    现在在 Javascript / JQuery 的回调函数中,我们可以利用这个结果 JSON 对象并相应地在 UI 上显示响应数据。

    更多详情 click here

    【讨论】:

      【解决方案4】:

      您可以使用 jQuery AJAX 方法轻松调用任何控制器的操作,如下所示:

      请注意,在此示例中,我的控制器名称是 Student

      控制器动作

       public ActionResult Test()
       {
           return View();
       }
      

      在上述控制器的 Any View 中,您可以像这样调用 Test() 操作:

      <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
      <script>
          $(document).ready(function () {
              $.ajax({
                  url: "@Url.Action("Test", "Student")",
                  success: function (result, status, xhr) {
                      alert("Result: " + status + " " + xhr.status + " " + xhr.statusText)
                  },
                  error: function (xhr, status, error) {
                      alert("Result: " + status + " " + error + " " + xhr.status + " " + xhr.statusText)
                  }
              });
          });
      </script>
      

      【讨论】:

      • ActionResult 或 JsonResult
      【解决方案5】:

      针对上面的帖子,我认为它需要这一行而不是你的行:-

      var strMethodUrl = '@Url.Action("SubMenu_Click", "Logging")?param1='+value1+' &param2='+value2
      

      否则你将实际的字符串 value1 和 value2 发送到控制器。

      但是,对我来说,它只调用一次控制器。它似乎每次都命中“receieveResponse”,但控制器方法上的断点显示它只被命中第一次,直到页面刷新。


      这是一个可行的解决方案。对于cshtml页面:-

         <button type="button" onclick="ButtonClick();"> Call &raquo;</button>
      
      <script>
          function ButtonClick()
          {
              callControllerMethod2("1", "2");
          }
          function callControllerMethod2(value1, value2)
          {
              var response = null;
              $.ajax({
                  async: true,
                  url: "Logging/SubMenu_Click?param1=" + value1 + " &param2=" + value2,
                  cache: false,
                  dataType: "json",
                  success: function (data) { receiveResponse(data); }
              });
          }
          function receiveResponse(response)
          {
              if (response != null)
              {
                  for (var i = 0; i < response.length; i++)
                  {
                      alert(response[i].Data);
                  }
              }
          }
      </script>
      

      对于控制器:-

      public class A
      {
          public string Id { get; set; }
          public string Data { get; set; }
      
      }
      public JsonResult SubMenu_Click(string param1, string param2)
      {
          A[] arr = new A[] {new A(){ Id = "1", Data = DateTime.Now.Millisecond.ToString() } };
          return Json(arr , JsonRequestBehavior.AllowGet);
      }
      

      每次调用都可以看到时间变化,所以没有缓存值...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-26
        • 2014-08-18
        • 1970-01-01
        • 2011-07-13
        相关资源
        最近更新 更多