Asp.net mvc Json结果提示“;另存为;浏览器中的对话框,而不是正在处理的对话框。ASP.NETMVC

Asp.net mvc Json结果提示“;另存为;浏览器中的对话框,而不是正在处理的对话框。ASP.NETMVC,asp.net-mvc,ajax,json,Asp.net Mvc,Ajax,Json,我知道这对其他人来说是个问题,但我还没有找到任何方法来解决我的问题 我有一个局部视图,它显示在一个灯箱(colorbox)中。这是一种简单的形式。我希望表单提交并返回一点数据。这些数据将用于调用后续函数,我希望主DIV只更新一条“success”消息。以下是部分视图的完整代码: <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Solution2.Models.Category>" %>

我知道这对其他人来说是个问题,但我还没有找到任何方法来解决我的问题

我有一个局部视图,它显示在一个灯箱(colorbox)中。这是一种简单的形式。我希望表单提交并返回一点数据。这些数据将用于调用后续函数,我希望主DIV只更新一条“success”消息。以下是部分视图的完整代码:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Solution2.Models.Category>" %>

<script type="text/javascript">
    $('propcatform').submit(function(e) {
        e.preventDefault();

        $.ajax({
            type: "POST",
            url:  $(this).attr("action"),
            data: $(this).serialize(),
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function(data) { document.getElementById('main1').innerHTML = "Success"; },
            failure: function() { document.getElementById('main1').innerHTML = "Failure"; }
        })
    });
    </script>

    <% using (Html.BeginForm(null, null, FormMethod.Post, new { id = "propcatform", name = "propcatform" }))
       {%>
        <div id="main1">
        <fieldset>
            <legend>Fields</legend>
            <p>
                <label for="CatTitle">Category Title:</label>
                <%= Html.TextBox("CatTitle") %>
                <%= Html.ValidationMessage("CatTitle", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
        </div>

    <% } %>
目前,我没有在部分视图代码中实际使用任何结果数据(即使我在“success”参数中引用了它)。我只是想让它工作(而不是提示我保存结果)


谢谢。

通常情况下,您不会直接通过普通表单提交将Json返回到用户浏览器。这是一种很好的方式来传递您计划在内部消化的信息(如您所描述的),但是按照上面的方式将Json数据吐回给用户,就像。。。。Javscript——它不是有效的HTML,根据浏览器的配置,它可能会弹出一个“另存为”对话框

在您的示例中,您可以尝试将默认操作设置为返回创建视图,并进行如下检查:

if (Request.IsAjaxRequest())
{
  return Json(.......);
}
else
{
  return View(....);
}
…并将函数返回类型更改为
ActionResult

这将确保页面的初始加载显示实际视图。对同一页面的Ajax调用(从页面上的按钮)将只返回您感兴趣的Json数据

更新:


如果除了更新的Json内容外,操作应该显示相同的页面,我建议不要使用Submit按钮。只需使用普通的输入按钮,并将单击操作绑定到您的
jQuery.ajax
调用。数据将从
Create/POST
操作中接收,并将根据Ajax调用中的
success:
子句进行填充。

我也遇到过同样的问题,这对我很有效:

return new JsonResult
{
  ContentType = "text/html",
  Data = new { foo = 1, bar = "Something" }
};

显式创建一个新的
JsonResult
对象,设置
ContentType
并返回,而不是使用
Json
方法。

使用Firefox+Firebug。

谢谢。您有什么建议可以最好地处理我想做的事情,即在色盒中显示和处理一个简单的表单?我对这一切都很陌生。谢谢,但是你如何处理视图上的响应?不,它将输出写入浏览器。
return new JsonResult
{
  ContentType = "text/html",
  Data = new { foo = 1, bar = "Something" }
};