我的asp.net-mvc项目中有以下
javascript代码和控制器操作:
使用Javascript:
$("#exportPPT").live('click',function (e) { window.location.href = "/Initiative/GenerateFile" + GenerateParams(); });
C#控制器:
public ActionResult GenerateFile(MyParams myParams) { var template = Server.MapPath(PPT_ROOT + "/template.pptx"); IEnumerable<Order> orders = Model.GetOrders(myparams); var pptResults = GeneratePowerpointFile(orders); return File(pptResults.Content,"application/vnd.ms-powerpoint",pptResults.FileName); }
但在某些条件下,让我们说当orders.Count()为0然后而不是生成一个文件时,我宁愿向用户说一条错误消息,说你有错误.
鉴于上述代码,实现此目标的最佳方法是什么?我想把它改成ajax调用,但我不知道如何在json请求中下载我的Fie()和包(如果支持的话).
有什么建议?
解决方法
我会向另一个检查订单计数的控制器操作发起$.get请求.返回该值,并在适当的情况下返回错误消息.在需要时显示错误消息,否则处理重定向以下载文件.这是对控制器的额外调用,但它允许您完全控制并处理错误的可能性,而无需重定向您的用户.
$("#exportPPT").live('click',function (e) { $.get( "/Initiative/CheckForOrders" + GenerateParams(),function( data ) { if (data.IsValid) { window.location.href = "/Initiative/GenerateFile" + GenerateParams(); } else { alert(data.ErrorMessage); // or show a div containing error message } }); });
控制器动作:
public ActionResult CheckForOrders(MyParams myParams) { IEnumerable<Order> orders = Model.GetOrders(myparams); if (orders.Any()) return Json(new { IsValid=true },JsonRequestBehavior.AllowGet); return Json(new { IsValid=false,ErrorMessage="No orders" },JsonRequestBehavior.AllowGet); }