10

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呼び出しに変更することを考えましたがFie()、JSONリクエスト内で自分とパッケージをダウンロードする方法がわかりませんでした(またはそれがサポートされているかどうか)。

4

7 に答える 7

11

注文数をチェックする別のコントローラー アクションに対して $.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);
}
于 2014-01-14T14:14:11.583 に答える
5

リソースが存在しないことを表すステータスを返し、null を返しますか? 次に、複数の ajax 呼び出しを行って 1 つが利用可能であることを確認したり、誰かがそのようなチェックをバイパスした場合のセキュリティへの影響を心配したりすることなく、JavaScript で適切に処理できます。

例えば...

コントローラ

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);
}
于 2014-01-20T14:33:53.660 に答える
1

orders.Count() が 0 の場合、またはその他のエラーが発生した場合は、ユーザーをリダイレクトすることをお勧めします。このようなもの。

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 ビューを作成します。

于 2014-01-03T15:00:20.327 に答える
1
if (count==0) return View();
else return File(...)

これは機能しませんか?

于 2014-01-03T02:43:06.420 に答える
1

@Anthony Shawの答えは問題ありませんが、2 つの懸念事項があります。

  1. エクスポート ファイル プロセスでエラーが発生した場合はどうtry{} catch{}なりますか?
  2. 現在のページを維持しながら、メッセージをより親しみやすく返すにはどうすればよいでしょうか?

答えは、次の 2 つのステップでそれを達成するために使用する必要があります。Ajax

  1. ajax を呼び出してファイルを生成し、そのメモリ データをSessionまたはに格納する必要がありTempDataます。

アヤックス

$ajax({
    cache: false,
    url: '/Initiative/GenerateFile',
    data: GenerateParams(), 
    success: function (data){
         var response = JSON.parse(data);
         if(response.IsSuccesful) {
           window.location = '/Initiative/DownloadFile?fileGuid=' + response.FileGuid 
                           + '&filename=' + response.FileName;
         }else{
           alert(response.ErrorMessage);
         }
    }
});

コントローラ

    public ActionResult GenerateFile(MyParams myParams)
    {
        IEnumerable<Order> orders = Model.GetOrders(myparams);
        if (orders.Count() == 0)
        {
            return new JsonResult
            {
                Data = new { IsSuccesful = false, ErrorMessage = "No orders" }
            };
        }
        try
        {
            var pptResults = GeneratePowerpointFile(orders);
            var guid = Guid.NewGuid().ToString();
            TempData[guid] = pptResults.Content;
            return new JsonResult
            {
                Data = new { IsSuccesful = true, FileGuid = guid, FileName = pptResults.FileName }
            };
        }
        catch (Exception err)
        {
            return new JsonResult
            {
                Data = new { IsSuccesful = false, ErrorMessage = err }
            };
        }

    }
  1. を読み取り、そのファイルも返す新しいDownloadFileアクションを作成します。TempData[guid]

    [HttpGet]
    public virtual ActionResult DownloadFile(string fileGuid, string fileName)
    {
        if (TempData[fileGuid] != null)
        {
            var data = TempData[fileGuid] as byte[];
            return File(data, "application/vnd.ms-powerpoint", fileName);
        }
        else
        {
            return new EmptyResult();
        }
    }
    

AJAX MVC 経由で Excel ファイルをダウンロード

于 2021-01-08T07:49:35.360 に答える
1

たぶん、この投稿が役に立つかもしれません: Javascript/jQuery を使用してファイルをダウンロード

JQuery File Download プラグインは注目に値すると思います。エラーを適切に処理します :) オンライン デモもご覧ください...

于 2014-01-19T17:46:45.763 に答える