Jquery 返回文件的mvc3 json结果
我的情况是:我有一个对话框表单,可以在数据库中插入一些数据。验证完所有内容后,表单信息将转换为数据库对象(我使用linq to sql)并提交。 由于我使用jqueryajax进行此操作,因此我有一个success函数,它向用户显示一些消息(只是通知用户他的操作成功),关闭对话框并刷新主页。这就是问题所在,由于出现了一个奇怪的下载窗口,询问我是否要下载控制器操作(您将看到我的代码),所以没有任何成功操作发生 以下是简化的代码: JQuery提交功能Jquery 返回文件的mvc3 json结果,jquery,json,asp.net-mvc-3,Jquery,Json,Asp.net Mvc 3,我的情况是:我有一个对话框表单,可以在数据库中插入一些数据。验证完所有内容后,表单信息将转换为数据库对象(我使用linq to sql)并提交。 由于我使用jqueryajax进行此操作,因此我有一个success函数,它向用户显示一些消息(只是通知用户他的操作成功),关闭对话框并刷新主页。这就是问题所在,由于出现了一个奇怪的下载窗口,询问我是否要下载控制器操作(您将看到我的代码),所以没有任何成功操作发生 以下是简化的代码: JQuery提交功能 //Submete a nova s
//Submete a nova solicitão ao servidor e atualiza a página em caso de sucesso
$("#novaSIForm").submit(function (e) {
e.preventDefault();
$.ajax({
type: "Post",
url: $(this).attr("action"),
cache: false,
data: $(this).serialize(),
success: function (data) {
//Fecha a modal
$("#novaSIModal").dialog("close");
//Após a requisição ter sucesso, atualiza a página
$("#SiContainer").load('@Url.Action("SolicitacoesInternas")');
alert(data.msg);
},
error: function (jqr, errorStatus, errorThrow) {
alert("Erro ocorrido " + errorStatus);
}
});
return false; //Isso faz com o que o form não execute sua ACTION
});
行动
public ActionResult SiNovaSI(ChamadoViewModel chVM, string tituloChamado)
{
try
{
CHAMADO ch = new CHAMADO();
ch.InjectFrom(chVM);//Injeta os valores da ViewModel no novo Chamado criado
//Seta outras propriedades que não foram injetadas anteriormente
ch.DATAINICIO = DateTime.Now;
ch.SOLICITANTE = ((USUARIO)Session["UsuarioLogado"]).NOMEREDUZIDO;
ch.STATUS = "SOLICITADO";
ch.VALORDEBITO = ((DEBITO)Session["Debitos"]).VALORPARCELA;
ChamadoManager chMan = new ChamadoManager();
chMan.InsertCHAMADO(ch);//Insere o novo chamado no banco de dados
return Json(new { sucesso = true, msg = "Chamado cadastrado com sucesso" });
}
catch (Exception e)
{
return Json(new { sucesso = false, algo = "Nao foi possível registrar o chamado. Erro: " + e.Message });
}
}
图像
哦,我忘了提到我已经包含了所有必要的jquery脚本。包括一些MS Ajax脚本(即使我不再使用它)。在Ajax调用中,可能需要明确指定Json作为您期望的返回类型:
dataType: "json",
如果此#novaSIForm
是动态生成的(可能是在AJAX调用之后),则可能会丢失。如果替换DOM元素,则提交处理程序。因此,您可以使用.live
方法。还要确保此事件订阅发生在文档.ready
事件处理程序中(如果您使用的是.submit
而不是.live
)
还可以使用FireBug检查正在发送的实际AJAX请求,并且没有出现javascript错误。尽管我昨天没有发布,但我尝试传递了几种不同的数据类型,但没有一种成功,包括json。事实上,我已经在2分钟前测试过了。谢谢你的正确答案。似乎DOM元素正在被替换。现在我不明白的是,考虑到昨天的尝试,为什么它今天起作用了。事实上,使用“.live”已经两次触发了我的提交事件。无论如何,谢谢你的快速回答。@Adriano RR,也许你还有另一个。提交事件注册?除了.live
。您实际上看到FireBug中触发了2个AJAX请求?除非我的Html.BeginForm()触发了它自己的提交,否则我不会进行任何其他提交。是我的对话框按钮通过$(“#novaSIForm”).submit()调用我的提交。是的,firebug显示了2个POST请求和2个GET(这是由于my.load事件)。是否要查看整个代码?@Adriano RR,如果您通过从提交处理程序返回false来正确取消默认提交,则表单不应提交两次。我能想到的唯一一件事是,不知何故,有两个为该表单注册的.submit处理程序。第一次启动submit操作时,它只发生一次。但如果尝试进行第二次插入,submit将触发两次。似乎我并没有通过调用load事件来替换DOM。也许我不应该从ajax成功函数内部调用load事件。
$('#novaSIForm').live('submit', function() {
...
return false;
});