将JQuery ajax GET转换为POST

时间:2014-04-07 13:26:58

标签: javascript jquery ajax asp.net-mvc razor

我在我的应用程序中的Index razor上有这个jquery ajax get方法:

$.ajax({
    url: "@Url.Action("SubmitProjectForPreapproval", "api/Project")",
    type: "GET",
    cache: false,
    data: { projectId: "@ViewContext.RouteData.Values["ProjectId"]" }
}).done(function (data) {

    var count = 0;
    $.each(data, function (index, value) {
        $("#ulMessages").append("<li>" + value + "</li>");
        count++;
    });

    // Assume validation errors if more than 1 message
    if (count > 1) {
        $("#btnSubmit").removeAttr("disabled");
    }

}).fail(function () {

    $("#ulMessages").append("<li>An error occurred. Please try again later</li>");
    $("#btnSubmit").removeAttr("disabled");

}).always(function () {

    $("#imgAjaxLoader").hide();

});

这会在api / project控制器中调用一个返回字符串列表的方法:

[HttpGet]
public List<string> SubmitProjectForPreapproval(int projectId)
{ ... }

我想要做的是将其转换为ajax post方法。在一天中的大部分时间里,我一直在努力做到这一点。我的问题是,为了实现这一目标,需要改变的是什么?例如 - 将方法的属性更改为[HttpPost],如何将路由值发送给它? (int pojectId)

编辑:如果我这样做,它可以出于某种原因:

public List<string> SubmitProjectForPreapproval(/*int projectId*/)
{
    int projectId = 3308;
    ...
}

如果我在那里有参数,不知道为什么它找不到我的方法。

2 个答案:

答案 0 :(得分:2)

我不确定 @Url 的内容如何与您的系统格式化 - 但只是将其更改为:

$.ajax({ url: "@Url.Action("SubmitProjectForPreapproval", "api/Project")", type: "POST", cache: false, data: { projectId: "@ViewContext.RouteData.Values["ProjectId"]" } }).done(function (data) {

如果你咬了一下:

@Url.Action("SubmitProjectForPreapproval

..其中有任何?xxx值,你还需要将它们添加到data: { ... }

答案 1 :(得分:0)

问题确实是我将数据发送到控制器操作的方式。我通过执行以下操作来修复它:

  • 更改ajax方法(使用JSON.stringify):

var projectIdObject = {
    ProjectId: "@ViewContext.RouteData.Values["ProjectId"]",
}

$.ajax({
    url: "@Url.Action("SubmitProjectForPreapproval", "api/Project")",
        type: "POST",
        cache: false,
        data: JSON.stringify(projectIdObject),
        contentType: 'application/json',
    }).done(function (data) { ... }
  • 添加一个类以获取此字符串化值:

public class ProjectIdObject
{
    public string ProjectId { get; set; }
}
  • 更改控制器操作方法以接收此新对象并提取我想要的值:

[HttpPost]
public List<string> SubmitProjectForPreapproval(ProjectIdObject projectIdObject)
{
    int projectId = int.Parse(projectIdObject.ProjectId);
    ...
}