Javascript 如何使用Ajax.begin通知MVC助手JSON结果?
我试图使用ASP.NET MVC Ajax.BeginForm帮助程序,但不想在调用完成时使用现有的内容插入选项。相反,我想使用自定义JavaScript函数作为回调函数 这是可行的,但是我想要的结果应该作为JSON返回。不幸的是,框架只是将数据作为字符串处理。下面是客户端代码。服务器代码只返回带有一个字段UppercaseName的JsonResultJavascript 如何使用Ajax.begin通知MVC助手JSON结果?,javascript,asp.net-mvc,asp.net-ajax,asp.net-mvc-3,jquery,Javascript,Asp.net Mvc,Asp.net Ajax,Asp.net Mvc 3,Jquery,我试图使用ASP.NET MVC Ajax.BeginForm帮助程序,但不想在调用完成时使用现有的内容插入选项。相反,我想使用自定义JavaScript函数作为回调函数 这是可行的,但是我想要的结果应该作为JSON返回。不幸的是,框架只是将数据作为字符串处理。下面是客户端代码。服务器代码只返回带有一个字段UppercaseName的JsonResult <script type='text/javascript'> function onTestComplete(conte
<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" />
<%} %>
功能onTestComplete(内容){
var result=content.get_data();
警报(结果。大写名称);
}
它不是显示大写的结果,而是显示未定义的结果。get_data()似乎保存JSON,但仅以字符串形式保存。如何将其转换为对象
所有这些看起来都有点复杂。是否有更好的方法使用Ajax.BeginForm获取结果内容?如果有这么难,我可以完全跳过Ajax.BeginForm,只使用jQuery表单库。试试以下方法:
var json_data = content.get_response().get_object();
这将以JSON格式显示结果,您可以使用
JSON\u数据[0]
获取第一条记录尝试使用以下代码:
<script type='text/javascript'>
function onTestComplete(content) {
var result = eval( '(' + content.get_data() + ')' );
alert(result.UppercaseName);
}
</script>
功能onTestComplete(内容){
var result=eval('('+content.get_data()+'));
警报(结果。大写名称);
}
确保已包含MicrosoftJax.js和MicrosoftMvcAjax.js。然后对返回的上下文使用以下调用从返回中获取json对象
var json = context.get_data();
var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);
您可以使用
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>
// 我使用:
function onTestComplete(data, status, xhr) {
var data2 = JSON.parse(data.responseText);
//data2 is your object
}
能否显示控制器操作的代码?控制器操作不是问题所在。它实际上是一行:返回Json(new{UppercaseName=name.ToUpper()});好的,这起作用了。然而,这似乎仍然令人费解。我不知道他们为什么不直接返回数据。作为对Brian评论的回应,他们“不直接返回数据”的原因是因为对象形式不是通过HTTP返回的默认数据形式。当您进行http调用时,会返回一个字符串。事实上,为了将其转化为一个对象,您必须采取额外的步骤,使用eval函数对其进行求值。那么get_data()应该做什么呢?时代已经改变了,因此,请参阅我使用onSuccess(data,status,xhr)
@MaksimVi.:一点也不奇怪;)这些库现在是多余的,而且非常臃肿。我不想仅仅为了打一个这样的小电话就把他们包括进来。更好的解决方案是纯jquery,只需使用包含的不引人注目的jquery脚本。