使用$ .ajax或$ .post调用MVC 5 Controller方法

时间:2014-11-17 15:46:21

标签: javascript jquery ajax vb.net asp.net-mvc-5

我正在尝试使用JavaScript设置从MVC页面到控制器的非常简单的调用。这是我的控制器:

Imports System.Web.Mvc

Namespace Controllers
    Public Class DataController
        Inherits Controller

        Function Index() As ActionResult
            Return View()
        End Function

        <HttpPost>
        Function SaveData(payload As String) As String
            If payload IsNot Nothing AndAlso payload.Length > 0 Then
                Return "Good"
            Else
                Return "Bad"
            End If
        End Function

    End Class
End Namespace

这是我的View(Index.vbhtml):

@Code
    ViewData("Title") = "Index"
End Code

<h2>Index</h2>

@Code
    Html.BeginForm()
    @:<a href="#" onclick="SaveData();">Save Data</a>
    Html.EndForm()
End Code

这是我的JavaScript(通过_layout.vbhtml文件包含):

function SaveData() {

    var payload = "TEST_DATA_GOES_HERE";

    // Calls controller correctly but data is null
    $.ajax({
        url: "/Data/SaveData",
        type: "POST",
        processData: false,
        dataType: String,
        data: { payload: payload }
    })
    .done(function () { alert('Application saved.'); })
    .fail(function () { alert('Application failed to save.'); });

    // Returns a 500 error
    $.post("/Data/SaveData", { Payload: payload }, function (data) { alert('Application saved. ' + data); }, "String");

    // Calls controller correctly but data is null
    $.post("/Data/SaveData", payload, function () { alert('Application saved.' + data); }, "String");
}

调试时所有内容都很好地连接,但payload变量在Nothing函数中以SaveData的形式到达。我已尝试使用$.post,但遇到类似的问题,我发现使用任何一种方法的所有引用都只是假设它将首次运行而没有错误,并且没有任何疑难解答提示。

如何配置$.ajax$.post函数以正确调用控制器并传递一个简单的字符串?

2 个答案:

答案 0 :(得分:1)

您需要将processData设置为true,因为您要发送一个需要转换为查询字符串的对象。

来自API:

  

<强>过程数据
  默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型“application / x-www-form-urlencoded” 。如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。

http://api.jquery.com/jQuery.ajax/

答案 1 :(得分:0)

感谢Rory的回答,这就是我最终的结果:

控制器:

<HttpPost>
Function SaveData(payload As String) As Boolean
    If payload IsNot Nothing AndAlso payload.Length > 0 Then
        Return True
    Else
        Return False
    End If
End Function

JavaScript的:

function SaveData() {

    var payload = "TEST_DATA_GOES_HERE";

    // Calls controller correctly but data is null
    $.ajax({
        url: "/Data/SaveData/",
        type: "POST",
        data: { payload: payload }
    })
    .done(function () { alert('Application saved.'); })
    .fail(function () { alert('Application failed to save.'); });

}

请注意,$.ajax调用没有processDatadataType元素,并且变量的名称与参数的大小写匹配。

然而,我发现我的真正的问题实际上是由于在此调用中将XML作为字符串传递而引起的。 XML不能像查询字符串中那样简单地传递。如果这样做,它最有可能到达null,因为MVC模型绑定器无法处理生成的错误查询字符串。