0

コントローラーを使用すると、ファイルを特定のパスにアップロードできます。ビューで反復ファイルを削除する方法を見つけようとしています。

コントローラーの方法:

[Authorize(Roles = "Moderatorzy")]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteFile(string file)
        {
            if (!System.IO.File.Exists(file))
            {
                return NotFound();
            }
            System.IO.File.Delete(file);
            return View("Edit");
        }

ファイルを閲覧する:

<form asp-action="Edit" method="post" enctype="multipart/form-data">
        <input type="hidden" asp-for="ID" />
        (...)
        @if (Enumerable.Count(ViewBag.fileList) != 0)
        {
            <dir>Files to download:</dir>
            {
                foreach (var file in ViewBag.fileList)
                {
                    <a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>

                }
            }
        }
(...)
        <div class="text-center">
            <button class="btn btn-success" type="submit">Zapisz</button>
            <a href="javascript:history.go(-1)" class="btn btn-primary">Powrót</a>
        </div>
<div class="space"></div>

現在、私は2つの問題を抱えています:

1)Autobusはコントローラ名です。の代わりにhref="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"パス: を教えてくれます。なんで?/Autobus/Autobus/DeleteFile(...)/Autobus/DeleteFile(...)

2) 手動で 1 つだけ入力した後、メソッドAutobusを呼び出しませんDeleteFile。なんで?

生成された完全なルート パスは次のとおりです。http://localhost:50686/Autobus/Autobus/DeleteFile?file=C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg

PSルーティングに問題がある可能性があると推測しています。

4

2 に答える 2

2

私の最終的な解決策:

ファイルを閲覧する:

(...)
@if (Enumerable.Count(ViewBag.fileList) > 0)
    {
        <dir>Wgrane już pliki:</dir>
        {
            foreach (var someFile in ViewBag.fileList)
            {
                <form asp-action="DeleteFile" method="post">
                    @Html.AntiForgeryToken()
                    <input type="hidden" name="file"value="@someFile" asp-action="@(ViewBag.fileDirectory + someFile)" />
                    <button class="btn btn-danger" type="submit">Usuń</button>
                    @someFile
                </form>
            }
        }
    }
(...)

また、DeleteFile メソッドに ViewBags を追加する必要がありました。

[Authorize(Roles = "Moderatorzy")]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteFile(string file)
        {
            string fileDirectory = Path.Combine(
                      Directory.GetCurrentDirectory(), "wwwroot/uploaded/bus/");
            ViewBag.fileList = Directory
                .EnumerateFiles(fileDirectory, "*", SearchOption.AllDirectories)
                .Select(Path.GetFileName);
            ViewBag.fileDirectory = fileDirectory;
            string webRootPath = _hostingEnvironment.WebRootPath;
            var fileName = "";
            fileName = file;
            var fullPath = webRootPath + "/uploaded/bus/" + file;

            if (System.IO.File.Exists(fullPath))
            {
                System.IO.File.Delete(fullPath);
                ViewBag.deleteSuccess = "true";
            }
            return View("Edit");
        }
于 2018-11-18T20:22:12.730 に答える
0

生成された完全なパスのこの部分:

C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg

このコード行が原因ViewBag.fileDirectoryです->

<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a>

サーバー (ローカル コンピューター) 内のファイルの実際のパスをビューに使用すると、多くの問題が発生する可能性があります。各ファイルの id のようなものを定義し、そのファイルの id をコントローラ アクション メソッドに送信し、その後、この id がどのファイルのものであるかを認識し、最後にそのファイルを削除する必要があります。

したがって、次のようにコードを変更する必要があります。

この場合、ファイルの名前は id. これは標準的な方法ではありませんが。これは学習目的のためだけに行います。

コードのこの行を変更します->

<a class="down" href="Autobus/DeleteFile?file=@(ViewBag.fileDirectory + file)"><dir>@file<span>;</span></dir></a> 

この行で->

@Html.ActionLink( $"Delete {file}", "DeleteFile", "Autobus", new { file = file}, new { })

これで、ブラウザで生成された各リンクをクリックすると、アクション メソッドDeleteFileがファイル名を受け取ります。DeleteFile次に、どのディレクトリがファイルであるかがわかっている場合は、アクション メソッドで次のような 1 行のコードを使用して削除できます。

System.IO.File.Delete(fileDirectory+file);

注意:fileDirectoryパスがこのようなものである 場合C:\Users\asus\Desktop\Praca%20IT\Programowanie\Projekty\DluzynaSzkola\ASP.NET%20Core%20-%20ostatni\Dluzyna_Szkola_2\BasicConfig\wwwroot/uploaded/bus/1.jpg 、アクション メソッド ( DeleteFile) は例外をスローします。したがって、次のようにコードを変更する必要があります。

string fullPath = Request.MapPath("~/uploaded/" + file);
if (System.IO.File.Exists(fullPath))
{
   System.IO.File.Delete(fullPath);
}

このコード~では、asp.net MVC アプリケーションのルートを指定します。uploadedフォルダーは、ファイルの検索に使用するフォルダーです (ファイル フォルダーに変更できます)。

このようにコードを変更すると、最初は小さな問題が発生する可能性がありますが、コンセプトは正しく、少し変更するだけでやりたいことを実行できます。

この回答があなたのお役に立てば幸いです....

于 2018-11-17T13:09:25.210 に答える