Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC中从目录中删除文件_C#_Asp.net Mvc - Fatal编程技术网

C# 在MVC中从目录中删除文件

C# 在MVC中从目录中删除文件,c#,asp.net-mvc,C#,Asp.net Mvc,一年前我用MVC写了一些代码,我对框架的了解似乎已经消失了。在下面的代码块中,我列出了目录中的所有文件,并提供了下载它们的链接(针对经过身份验证的用户)。我想做的是提供删除每个文件的选项。我刚刚添加了一个删除按钮,但我不确定从那里去哪里 @{IEnumerable<string> enumerateFiles = Directory.EnumerateFiles(Server.MapPath("~/Content/Documents"));} @{ if (Request.I

一年前我用MVC写了一些代码,我对框架的了解似乎已经消失了。在下面的代码块中,我列出了目录中的所有文件,并提供了下载它们的链接(针对经过身份验证的用户)。我想做的是提供删除每个文件的选项。我刚刚添加了一个删除按钮,但我不确定从那里去哪里

@{IEnumerable<string> enumerateFiles = Directory.EnumerateFiles(Server.MapPath("~/Content/Documents"));}
@{
    if (Request.IsAuthenticated)
    {
        <h3>Authenticated User: @User.Identity.Name</h3>
        <h4>-Downloadable Files-</h4>
<ul>

    @foreach (var fullPath in enumerateFiles)
    {         
        var fileName = Path.GetFileName(fullPath);

             <li> <a href="../../Content/Documents/@fileName"> @fileName</a>
             <button type="button"  id="fileRemover" value="Delete" onclick="return confirm('Are you sure?')" >Delete</button> 
             </li>
    }
</ul>
    }
else
{
     <h3>Non-Authenticate User, register and/or login to see documents</h3>
}
}
@{IEnumerable enumerateFiles=目录.enumerateFiles(Server.MapPath(“~/Content/Documents”);}
@{
如果(请求已验证)
{
已验证用户:@User.Identity.Name
-可下载文件-
    @foreach(枚举文件中的var fullPath) { var fileName=Path.GetFileName(完整路径);
  • 删除
  • }
} 其他的 { 非身份验证用户、注册和/或登录以查看文档 } }
查看文件和删除文件的代码应包含在控制器中。视图仅用于向用户显示信息(通常来自模型)

如果我是你,我会这样构造控制器:

public class FilesController : Controller
{
    public ActionResult List()
    {
        List<FileInfo> model = new List<FileInfo>();
        //  Grab all file names from the directory and place them within the model.

        return View(model);
    }

    public ActionResult View(string fileName)
    {
        //  Add header for content type
        //  Grab (and verify) file based on input parameter fileName

        return File(...);
    }

    public ActionResult Delete(string fileName)
    {
        //  Verify file exists
        //  Delete file if it exists

        return RedirectToAction("List");
    }
}
公共类文件控制器:控制器
{
公共行动结果列表()
{
列表模型=新列表();
//从目录中获取所有文件名并将其放置在模型中。
返回视图(模型);
}
公共操作结果视图(字符串文件名)
{
//为内容类型添加标题
//根据输入参数文件名获取(并验证)文件
返回文件(…);
}
公共操作结果删除(字符串文件名)
{
//验证文件是否存在
//删除文件(如果存在)
返回重定向到操作(“列表”);
}
}

文件名应作为HTTP POST变量提供

因此,必须创建一个隐藏字段来保存文件名,以便在提交表单时可以访问操作上的值

在操作名称上方,您将使用[HttpPost]属性,以便表单提交在此操作上登录

使用HTTP POST而不是HTTP GET是安全的,否则任何具有url的人都可以删除文件

如果有多个文件名,则每个隐藏字段的名称可以为filename_1、filename_2等


我已经给了你看和调查的方向。

你应该把你所有的C#从你的视野中移开。这将重新调整您对服务器端和客户端之间差异的记忆。这是我尝试做的第一件事。我不知道如何将文件名传递给删除操作。我在视图@using(Html.BeginForm(“Delete”,“Home”,FormMethod.Post)){}中使用了两种方法:a)将文件名的删除链接作为查询字符串的一部分(假设您的删除操作可以使用GET HTTP动词). 类似于:b)单击delete按钮时会触发一些javascript。javascript将填充一个隐藏的表单字段(id=“fileName”)。填充隐藏字段后,提交表单。