Javascript 如何使用Ajax.begin通知MVC助手JSON结果?

Javascript 如何使用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

我试图使用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" />
<%} %>

功能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脚本。