【问题标题】:call controller action from .cshtml page with jquery使用 jquery 从 .cshtml 页面调用控制器操作
【发布时间】:2012-02-17 15:16:58
【问题描述】:

我正在尝试从 jquery UI 对话框调用控制器操作。 我目前拥有的是这样的:

.html("<p><textarea name=\"TextMessage\" id=\"textItems\" rows=\"10\" cols=\"72\" /><br /><br /><input type=\"button\" style=\"float:right;\" id=\"submitData\" onclick=\"Test()\" value=\"Submit\" /></p>");

我用来调用控制器动作的脚本是这个:

<script type="text/javascript">
    function Test() {
        $ajax({
            url: '<%= Url.Action("GetData", "Report") %>',
            success: function (data) {
                alert(data);
            }
        });
    };
</script>

控制器动作是这样的:

[HttpGet]
        public JsonResult GetData()
        {
            return Json("success", JsonRequestBehavior.AllowGet);
        }

我想知道我是否做错了什么,我试图让它工作但没有任何成功。当我尝试通过http://localhost:1322/Report/GetData 直接启动控制器时,它工作正常,这意味着脚本设置不正确。

【问题讨论】:

  • 如果返回 JSON,则需要设置 dataType: 'json' 属性。您还应该在您的 ajax 调用中包含“错误:函数(...”)。
  • 您似乎缺少 Test 函数上的右括号,但这可能只是一个错字。
  • @JackieChiles 我更新了测试功能,看看是不是还可以,也没啥作用
  • @rontornambe 是否可以给我一个例子,这对我有很大帮助。提前谢谢
  • @Laziale:当您说您能够“直接启动控制器”时,您是指导航到该 URL(在浏览器中),还是您的意思是如果您设置该 URL 作为 AJAX 调用的 url 参数?顺便说一句,通过您的编辑,您现在在 Test 的右括号后面有一个尾随分号。

标签: javascript jquery asp.net-mvc-3 jquery-ui razor


【解决方案1】:

你应该试试:

url:'@Url.Action("GetData", "Report")'

MVC在寻找控制器时,会自动在第二个参数末尾添加“Controller”。

编辑:

此代码可能有效:

function Test() {
    $.ajax({
        type: "GET",
        dataType: "json",
        url: '@Url.Action("GetData", "Report")',
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            alert(data);
        },
        error: function(xhr, status, error) {
            alert(error);
        }
    });
}

编辑 2:

更改为使用 Razor 语法,以便此代码适用于 Razor/MVC3。

【讨论】:

  • 您在$.ajax 中缺少.
  • @JackieChiles 与您现在提供的代码我收到错误“错误请求”,所以肯定在后台发生了一些事情。为什么不好的要求,知道吗?谢谢
  • @Craig:谢谢,也许这就是 OP 问题的根源——我刚刚看到上面缺少它(以及您对它的评论)。好收获!
  • @Laziale:这很奇怪。请查看我编辑的代码:尝试添加 contentType: "application/json; charset=utf-8" 行。
  • @Laziale:另外,您的控制器操作中不需要[HttpGet]
【解决方案2】:

您在 Url.Action 上使用 MVC-2 语法。这应该有效:

function Test() {
  $.ajax(
    {
      url: '@Url.Action("GetData", "Report")',
      dataType: 'json',
      success: function (data) {
        alert(data);
      },
      error: function (x, err, desc) {
        alert(desc);
      }
    }
  );
};

【讨论】:

    【解决方案3】:

    因为您正在调用一个返回json 对象的操作方法,所以您可以使用jQuery.getJSON() 方法。

    <script type="text/javascript">
        function Test() {
            $.getJSON(
                '@this.Url.Action("GetData", "Report")',
                function (data) {
                    alert(data);
                }
            });
        };
    </script>
    

    【讨论】:

    • 什么也没有发生。我试图运行的脚本来自 jquery UI 对话框,你认为这可能是我没有得到任何东西的原因吗?谢谢
    • @Laziale 如果在Test()函数的第一行添加alert(""),点击按钮时会弹出吗?
    • @Laziale 您正在使用getJSON() 现在正确吗?您确定您的页面中已包含jQquery 吗?您可以通过 alert($) 验证它应该提醒一个功能。
    • @Laziale 如果您使用razor 视图引擎,那么您需要使用语法@this.Url.Action("GetData", "Report") 来生成URL。检查源以查看实际为 URL 生成的内容。
    • 是的,我得到了这个:function (a, b) { return new e.fn.init(a, b, h); }
    【解决方案4】:

    你也可以试试 jsaction: http://jsaction.codeplex.com

    【讨论】:

      【解决方案5】:

      我们可以很方便地使用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方法。 p>

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

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

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

      Json(arr , JsonRequestBehavior.AllowGet);

      并返回该 Json 对象。

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

      更多详情 click here

      【讨论】:

        猜你喜欢
        • 2021-04-26
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多