使用$ .ajax或$ .post调用MVC 5 Controller方法
我正在尝试使用JavaScript设置从MVC页面到控制器的非常简单的调用。 这是我的控制器:
Imports System.Web.Mvc Namespace Controllers Public Class DataController Inherits Controller Function Index() As ActionResult Return View() End Function 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 Index
@Code Html.BeginForm() @:Save Data 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
变量在SaveData
函数中作为Nothing
到达。 我尝试过使用$.post
但是遇到了类似的问题,并且我发现使用任何一种方法的所有引用都只是假设它会在没有错误的情况下首次运行,并且没有任何故障排除提示。
如何配置$.ajax
或$.post
函数来正确调用控制器并传递一个简单的字符串?
在发送需要转换为查询字符串的对象时,需要将processData
设置为true
。
来自API:
处理数据
默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型“application / x-www-form-urlencoded” 。 如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。
感谢Rory的回答,这就是我最终的结果:
控制器:
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
调用没有processData
或dataType
元素,并且变量的名称与参数的大小写相匹配。
然而,我发现我的真正问题实际上是由于在此调用中将XML作为字符串传递而引起的。 XML不能简单地在查询字符串中传递。 如果你这样做,它最有可能是null
因为MVC模型绑定器不能处理生成的错误查询字符串。