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

 堵晴__晨1997_361 发布于 2023-02-06 19:53

我的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 orders = Model.GetOrders(myparams);
        var pptResults = GeneratePowerpointFile(orders);
        return File(pptResults.Content, "application/vnd.ms-powerpoint", pptResults.FileName);
    }

但是在某些情况下,让我们说当orders.Count()为0然后而不是生成文件时,我宁愿向用户回复一条错误信息,说明你有错误.

鉴于上述代码,实现此目的的最佳方法是什么?我想把它改成ajax调用,但我不知道如何在json请求中下载我的Fie()和包(如果支持的话).

有什么建议?

2 个回答
  • 我将返回一个状态,表示资源不存在并返回null?然后你就可以相应地处理你的JavaScript它无需担心做多Ajax调用来检查一个可用或安全隐患,如果有人绕过此类检查.

    例如...

    调节器

    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);
    }
    

    2023-02-06 19:57 回答
  • 我会向另一个检查订单计数的控制器操作发起$ .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);
    }
    

    2023-02-06 19:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有