浏览器希望从控制器返回Json时将Json下载为文件

时间:2011-05-16 14:17:55

标签: json asp.net-mvc-3

  $("#frmCompose").submit(function () {

            $(this).ajaxSubmit({

                success: function (response) {
                    alert('success');
                }
            });

        });

控制器代码:

 [HttpPost]
        public ActionResult SendEmail(EmailMessageModel emailMessage)
        {
            try
            {
                // do something with the data
                return Json(new StatusModel { error = false });
            }
            catch (Exception)
            {
                return Json(new StatusModel { error = true, message = "Could not send email" });
            }
        }

查看代码:

<form id="frmCompose" method="post" action="SendEmail">
    <button id="compose" class="btn-pencil">
        Send</button>
    <div class="fields-inline">
        <div class="editor-label">
            @Html.Label("To:")
        </div>
        @Html.TextBox("txtTo")
    </div>
    <div class="fields-inline">
        <div class="editor-label">
            @Html.Label("Subject:")
        </div>
        @Html.TextBox("txtSubject")
    </div>
    <div class="fields-inline">
        <div class="editor-label">
            @Html.Label("Body:")
        </div>
        @Html.TextArea("txtBody")
    </div>
</form>

在我的控制器中,我返回带有文本消息的JSon结果。 为什么FireFox中的视图想要将json下载为文件下载?

我想做的就是确保我在成功回调

中得到回应

2 个答案:

答案 0 :(得分:3)

解决方案是在表单的submit()调用函数中返回false。

这样,json结果将在submit函数中使用,而不会传递给浏览器进行处理。

$("#frmCompose").submit(function () {

            // submit data to server here....


            return false;
        });

答案 1 :(得分:0)

根据documentation

  

由于无法上传   使用浏览器的文件   XMLHttpRequest对象,Form Plugin   使用隐藏的iframe元素来提供帮助   有了这个任务。这是常见的   技术,但它有固有的   限制。 iframe元素是   用作表格的目标   提交操作意味着   服务器响应写入   iframe中。如果回复,这很好   type是HTML或XML,但不起作用   如果响应类型是脚本也是如此   或JSON,两者都经常包含   需要重复的字符   找到时使用实体引用   HTML标记。

     

应对挑战   脚本和JSON响应,表单   插件允许这些响应   嵌入textarea元素和它   建议你这样做   这些响应类型在使用时   与文件上传相结合。

这基本上意味着如果你想使用jquery表单插件上传文件,而你的表单包含文件输入字段,服务器需要将返回的JSON包装到<textarea>标签中。