【问题标题】:Is there a SaveFileDialog in .Net Core 2.2?.Net Core 2.2 中是否有 SaveFileDialog?
【发布时间】:2019-10-23 07:55:25
【问题描述】:

我正在开发一个具有下载一些记录并将其保存为文本文件的功能的应用程序。 如果我为生成的文件放置一个静态位置,它就可以工作。我想让用户决定他们要保存这个文件的位置。 Asp.Net Core 2.2 MVC 中有 SaveFileDialog 吗?

我在控制器中的下载操作如下:

 public async Task<IActionResult> DownloadList([Bind("Id,isDownload")] BdoPE bdoPE)
        {
            UserDetails();
            string cncuser = ViewBag.DisplayName;
            var config = new CsvHelper.Configuration.Configuration();
            config.Delimiter = "\t";

            var records = new List<BdoRpt>();

            var record = _context.bdoPEs.Where(
                    c => c.DocType != null &&
                    c.isDownloaded == false &&
                    c.CompanyCode != null && 
                    c.AssignNum != null &&
                    c.ItemText != null &&
                    c.ItemText2 != null && 
                    c.isDownloaded == false &&
                    c.MarketerZ2 == cncuser).ToList();

            if (record.Count > 0)
            {
                foreach (var data in record)
                {
                    records.Add(new BdoRpt()
                    {
                        DocDateInDoc = data.DocDateInDoc,
                        DocType = data.DocType,
                        CompanyCode = data.CompanyCode,
                        PosDateInDoc = data.PosDateInDoc,
                        FiscalPeriod = data.FiscalPeriod,
                        CurrentKey = data.CurrentKey,
                        RefDocNum = data.RefDocNum,
                        DocHeadT = data.DocHeadT,
                        PosKeyInNextLine = data.PosKeyInNextLine,
                        AccMatNextLine = data.AccMatNextLine,
                        AmountDocCur = data.AmountDocCur,
                        ValDate = data.ValDate,
                        AssignNum = data.AssignNum,
                        ItemText = data.ItemText,
                        PosKeyInNextLine2 = data.PosKeyInNextLine2,
                        AccMatNextLine2 = data.AccMatNextLine2,
                        AmountDocCur2 = data.AmountDocCur2,
                        BaseDateDueCal = data.BaseDateDueCal,
                        ItemText2 = data.ItemText2,
                    });
                }

                using (var writer = new StreamWriter("C:\\file.txt")) // this is the static location
                using (var csv = new CsvWriter(writer, config))
                {
                    csv.WriteRecords(records);
                }
                recordDownloaded();
                var bdope = _context.bdoPEs.Where(
                    c => c.DocType != null &&
                    c.isDownloaded == false &&
                    c.CompanyCode != null &&
                    c.AssignNum != null &&
                    c.ItemText != null &&
                    c.ItemText2 != null &&
                    c.isDownloaded == false).ToList();

                foreach (var data in bdope)
                {
                    data.isDownloaded = true;
                }
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Lsmw));
            }
            else
            {
                NoRecordFound();
                return RedirectToAction(nameof(Lsmw));
            }
        }

目前在我的代码中,它只是我的驱动器 C:\

上的文本文件

【问题讨论】:

  • 没有。没有。显示您已经拥有的代码,您在最有可能返回文件的控制器方法上缺少正确类型的 content-disposition 标头。
  • 在这种情况下,“静态位置”是什么意思?如果用户从他们的浏览器下载它,那么这只是在内容标题中指定写入附件部分的问题,以弹出一个浏览器对话框。但在这种情况下,您将无法指定“静态位置”。如果您试图让用户浏览 服务器的 文件系统,这感觉很奇怪。
  • 我将编辑我的帖子,我将在我的控制器中添加我的代码
  • 您可以改为显示下载文件对话框:
    stackoverflow.com/a/50334901/5137920>
  • 不是将文件保存在控制器中,而是必须将文件返回给用户,以便用户可以将其保存在某个位置。

标签: c# text-files savefiledialog asp.net-core-mvc-2.0


【解决方案1】:

您可以改为显示下载文件对话框:
https://stackoverflow.com/a/50334901/5137920
请注意不要使用任何与桌面开发直接相关的库,以避免任何兼容性问题。

【讨论】:

  • 您好,在您提供的链接上,return File(System.IO.File.ReadAllBytes("C:\\file.txt"), "application/pdf"); 如何放置只能将文件另存为 .txt 的过滤器?
  • @jose:您将无法阻止用户使用他们想要的任何扩展名保存文件。即使您可以在浏览器级别做到这一点,您将如何阻止他们之后自己重命名它?为什么您认为您的应用程序应该能够控制我在本地计算机上使用的文件扩展名?
  • 请阅读共享答案中的“此处提到的其他方式”行,您还可以找到有关以文件here的形式响应用户请求的有用信息>
  • 无论如何,正如@Jon Skeet 所说,您不能将所有内容都强加给用户。在这里,您可能需要创建一个临时文件并将其发送给他们。之后,他们可能会更改文件名、类型甚至内容。
  • @FarhadRahmanifard 嗨,我已经按照步骤进行操作,但页面不新鲜我的退货部分return View(File(System.IO.File.ReadAllBytes(file), "application/octet-stream", "file.txt")); 如何组合这些代码? return View(File(System.IO.File.ReadAllBytes(file), "application/octet-stream", "file.txt")); 和 return RedirectToAction(nameof(Lsmw));
【解决方案2】:

无法直接从您的应用程序中显示保存对话框。您应该返回一个 FileResult 或任何派生的实现,并让浏览器决定如何处理您的数据。有一个功能可以帮助您。

见this link。

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 2020-01-31
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多