关于jquery:从Asp.net-mvc控制器动作返回File或ErrorMessage的最佳方法是什么?

What is the best way to return File or ErrorMessage from Asp.net-mvc controller action?

我的asp.net-mvc项目中有以下javascript代码和控制器操作:

使用Javascript:

1
2
3
$("#exportPPT").live('click', function (e) {
    window.location.href="/Initiative/GenerateFile" + GenerateParams();
});

C#控制器:

1
2
3
4
5
6
7
    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请求。返回该值,并在适当的情况下返回错误消息。在需要时显示错误消息,否则处理重定向以下载文件。这是对控制器的额外调用,但它允许您完全控制并处理错误的可能性,而无需重定向您的用户。

1
2
3
4
5
6
7
8
9
$("#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
    }
  });
});

控制器动作:

1
2
3
4
5
6
7
8
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);
}


我将返回一个状态,表示资源不存在并返回null?然后你可以在你的javascript中相应地处理它,而不用担心做多个ajax调用来检查一个是否可用,或者如果有人绕过这样的检查会带来安全隐患。

例如...

调节器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public ActionResult GenerateFile(MyParams myParams)
{
    var template = Server.MapPath(PPT_ROOT +"/template.pptx");
    IEnumerable<Order> orders = Model.GetOrders(myparams);

    if(!orders.Any()){
        Response.StatusCode = (int)HttpStatusCode.NotFound
        Response.StatusDescription = HttpStatusCode.NotFound.ToString();
        Response.TrySkipIisCustomErrors = true;
        return EmptyResult;
    }

    var pptResults = GeneratePowerpointFile(orders);
    return new File(pptResults.Content,"application/vnd.ms-powerpoint", pptResults.FileName);
}


也许这篇文章可能有用:
使用Javascript / jQuery下载文件

我相信JQuery文件下载插件值得一些关注,它优雅地处理错误:)看看它的在线演示,也...


如果您必须处理内部服务器错误,则必须设置自定义过滤器,将其应用于您的控制器方法,该方法拦截与磁盘相关的错误或任何错误,并正常处理,并返回您的视图一些有意义的数据消息。

请参阅这篇文章,关于创建一个asp.net mvc过滤器,以及相关的javascript代码。

ASP.NET MVC Ajax错误处理


如果orders.Count()为0或发生其他一些错误,我建议重定向用户。
像这样的东西。

1
2
3
4
5
6
7
8
9
10
11
public ActionResult GenerateFile(MyParams myParams)
{
    var template = Server.MapPath(PPT_ROOT +"/template.pptx");
    IEnumerable<Order> orders = Model.GetOrders(myparams);
    if(orders.Count() == 0){
       return RedirectToAction("Orders","ordersError",new { ID ="Error message"});
    }else{
       var pptResults = GeneratePowerpointFile(orders);
       return File(pptResults.Content,"application/vnd.mspowerpoint",pptResults.FileName);
    }
}

因此,您将创建一个信息性的ordersError视图,显示您的错误消息。


1
2
if (count==0) return View();
else return File(...)

这不行吗?