我正在尝试使用ASP.NET MVC Ajax.BeginForm帮助程序,但是在调用完成时不希望使用现有的内容插入选项。相反,我想使用自定义JavaScript函数作为回调。
这样可行,但我想要的结果应该作为JSON返回。不幸的是,框架只是将数据视为字符串。以下是客户端代码。服务器代码只返回一个带有一个字段UppercaseName的JsonResult。
<script type='text/javascript'>
function onTestComplete(content) {
var result = content.get_data();
alert(result.UppercaseName);
}
</script>
<% using (Ajax.BeginForm("JsonTest", new AjaxOptions() {OnComplete = "onTestComplete" })) { %>
<%= Html.TextBox("name") %><br />
<input type="submit" />
<%} %>
而不是显示大写结果,而是显示未定义。 content.get_data()似乎包含JSON,但只是以字符串形式。如何将其转换为对象?
所有这一切看起来都有点复杂。有没有更好的方法来使用Ajax.BeginForm获取结果内容?如果这很难,我可以完全跳过Ajax.BeginForm并只使用jQuery表单库。
答案 0 :(得分:23)
您可以使用OnFailure
和OnSuccess
代替OnComplete
; OnSuccess
为您提供适当的JSON对象数据。您可以在~/Scripts/jquery.unobtrusive-ajax.min.js
中找到要加载到页面上的回调方法签名。
在Ajax.BeginForm
:
new AjaxOptions
{
OnFailure = "onTestFailure",
OnSuccess = "onTestSuccess"
}
脚本块:
<script>
//<![CDATA[
function onTestFailure(xhr, status, error) {
console.log("Ajax form submission", "onTestFailure");
console.log("xhr", xhr);
console.log("status", status);
console.log("error", error);
// TODO: make me pretty
alert(error);
}
function onTestSuccess(data, status, xhr) {
console.log("Ajax form submission", "onTestSuccess");
console.log("data", data);
console.log("status", status);
console.log("xhr", xhr);
// Here's where you use the JSON object
//doSomethingUseful(data);
}
//]]>
</script>
这些签名与success
and error
callbacks in $.ajax(...)匹配,毕竟这可能不会让人感到意外。
使用asp.net-mvc-3与jquery 1.6.3和1.7.2进行了测试。
答案 1 :(得分:12)
试试这个:
var json_data = content.get_response().get_object();
这将为您提供JSON格式的结果,您可以使用json_data[0]
获取第一条记录
答案 2 :(得分:0)
尝试使用以下代码:
<script type='text/javascript'>
function onTestComplete(content) {
var result = eval( '(' + content.get_data() + ')' );
alert(result.UppercaseName);
}
</script>
答案 3 :(得分:0)
我用:
function onTestComplete(data, status, xhr) {
var data2 = JSON.parse(data.responseText);
//data2 is your object
}
答案 4 :(得分:-1)
确保您已包含MicrosoftAjax.js和MicrosoftMvcAjax.js。然后对返回的上下文使用以下调用以从返回中获取json对象。
var json = context.get_data();
var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);