一尘不染

从ASP.NET MVC2应用执行Ajax调用时出现问题

ajax

我将现有的ASP.NET应用程序转换为MVC2,并且有一个使用Ajax通过jQuery调用的现有方法,该方法以前曾起作用,但现在不起作用。因此,由于使用了我无法弄清楚的MVC2,似乎需要做一些更改。

我降低了代码的复杂性,但仍然无法正常工作。这是我当前的代码:

触发按钮单击的jQuery脚本

    function leaveComment() {
    if (validate()) {
        $.ajax({
            type: "POST",
            url: "/Pages/PostBlogComment",
            data: "{'name':'Test','url':'Test','email':'Test','body':'Test','postid':'Test'}",
            dataType: "json",
            success: function (msg) {
                //success code goes here
            },
            error: function (msg) {
               //error code goes here
            }
        });
    }


};

在名为Pages的控制器内部,我创建了以下方法:

    public string PostBlogComment( string name, string url, string email, string body, string postid)
    {
      return "This is a test";
    }

调试时,我可以看到调用了PostBlogComment方法,但是这里面临两个主要问题:

  1. 该方法的所有参数都将接收为null,因此没有可用的有用数据。为了立即进行测试,所有参数均按照Test从代码中看到的方式发送。
  2. 将结果返回给Ajax方法时,将调用错误路径,而不是成功路径,即使该方法确实按正常方式返回了字符串(即使发送的参数为空)也是如此。

对于那些经常使用这些东西的人来说,错误可能很容易发现(或者至少我希望如此:))


阅读 167

收藏
2020-07-26

共1个答案

一尘不染

这是完成这项工作所需的更改:

    $.ajax({
        type: 'POST',
        url: '/Pages/PostBlogComment',
        data: { 
            name: 'Test', 
            url: 'Test', 
            email: 'Test', 
            body: 'Test', 
            postid: 'Test'
        },
        success: function (result) {
            alert(result.Value);
        },
        error: function (msg) {
           //error code goes here
        }
    });

和你的控制器动作

    public ActionResult PostBlogComment( 
        string name, 
        string url, 
        string email, 
        string body, 
        string postid
    )
    {
        return Json(new { Value = "This is a test" });
    }

可以通过引入视图模型进行改进:

    public class PostViewModel
    {
        public string Name { get; set; }
        public string Url { get; set; }
        public string Email { get; set; }
        public string Body { get; set; }
        public string Postid { get; set; }
    }

然后:

    public ActionResult PostBlogComment(PostViewModel model)
    {
        return Json(new { Value = "This is a test" });
    }

注意事项:

  1. datajQuery AJAX调用的hash属性需要作为我的示例,否则您将发送JSON编码的字符串,而ASP.NET MVC的默认模型绑定器则不知道如何解析为操作参数。在ASP.NET MVC 3中,这已更改,因为有一个JsonValueProviderFactory允许您发送JSON请求。因此,如果您使用的是ASP.NET MVC 3,则可以这样发送AJAX请求,并且操作参数将正确绑定:
        $.ajax({
        type: 'POST',
        url: '/Pages/PostBlogComment',
        data: JSON.stringify({ 
            name: 'Test', 
            url: 'Test', 
            email: 'Test', 
            body: 'Test', 
            postid: 'Test'
        }),
        contentType: 'application/json',
        success: function (result) {
            alert(result.Value);
        },
        error: function (msg) {
           //error code goes here
        }
    });
  1. ASP.NET MVC中的所有控制器操作都必须返回ActionResults。因此,如果您想要Json,则返回JsonResult

  2. 该操作将匿名类型传递给Json方法,该方法包含Valuesuccess回调中使用的属性,服务器的响应如下所示:

    { 'Value': 'This is a test' }
    
  3. 部署此类文件时,请不要在您的javascript文件中使用此类硬编码网址,否则您的应用程序可能不会损坏。处理网址时,请始终使用Url帮助器:

        ...
    url: '<%= Url.Action("PostBlogComment", "Pages") %>',
    ...

或者,如果这是一个外部javascript文件,则可以使用一些在视图中初始化的全局js变量来指向正确的网址,也可以将此网址作为DOM的一部分(例如,作为anchorhref属性或HTML5 data-*属性),然后使用jQuery获取值。

2020-07-26