我正在尝试使用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
函数以正确调用控制器并传递一个简单的字符串?
答案 0 :(得分:1)
您需要将processData
设置为true
,因为您要发送一个需要转换为查询字符串的对象。
来自API:
<强>过程数据强>
默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型“application / x-www-form-urlencoded” 。如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。
答案 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
调用没有processData
或dataType
元素,并且变量的名称与参数的大小写匹配。
然而,我发现我的真正的问题实际上是由于在此调用中将XML作为字符串传递而引起的。 XML不能像查询字符串中那样简单地传递。如果这样做,它最有可能到达null
,因为MVC模型绑定器无法处理生成的错误查询字符串。