【问题标题】:Delete Uploaded file in MVC5?在 MVC5 中删除上传的文件?
【发布时间】:2015-02-12 12:32:50
【问题描述】:

我正在处理一个 MVC5 项目,我创建了一个简单的系统,用户可以为每个员工上传文件“CV”。 现在除了“删除文件”之外,一切都对我有用。 我需要添加删除上传文件的操作方法以及将其替换为另一个文件的功能。

在模型类中我创建了两个属性 HttpPostedFileBase CV 来保存上传的文件 和字符串 cvName,用于保存文件名并使用它来创建指向该文件的链接。

在控制器中我做了什么:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteCV(string cvName)
{
    //Session["DeleteSuccess"] = "No";
    var CVName = "";
    CVName = cvName;
    string fullPath = Request.MapPath("~/Content/CVs/" + CVName);

    if (System.IO.File.Exists(fullPath))
    {
        System.IO.File.Delete(fullPath);
        //Session["DeleteSuccess"] = "Yes";
    }
    return RedirectToAction("Index");
} 

这是视图:

<div class="form-group">
    @Html.LabelFor(model => model.CV, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @{
            if (File.Exists(Server.MapPath("~/Content/CVs/"
             + Html.DisplayFor(model => model.cvName))))
            {
                <a href="~/Content/CVs/@Html.DisplayFor(model => model.cvName)"> @Html.DisplayFor(model => model.cvName)  @Html.HiddenFor(model => model.cvName)</a>
                <a href="@Url.Action("DeleteCV", new { @Model.cvName })">
                    <img src="@Url.Content("~/Content/Images/Delete.jpg")" width="20" height="20" class="img-rounded" />
                </a>
            }
            else
            {
                <input type="file" name="file" accept="pdf" />
            }
        }
    </div>
</div> 

我无法删除文件,每次出现此消息时

找不到资源。

描述:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请检查以下 URL 并确保其拼写正确。

请求的 URL:/DeleteCV

【问题讨论】:

  • 那么,问题是什么?您的代码似乎没问题。什么不工作?您收到什么样的错误消息(如果有)?
  • 请注意:这肯定应该使用 DELETE 动词吗?将其更改为使用 HttpDelete 来检查语义。另外,您遇到的问题是什么?你能发布错误吗?
  • @iwayneo 嗯,不,您不能从表单发送 DELETE。不要叫我雪莉。
  • 哦,删除超链接! I like that!:D
  • 很快就会有很好的答案。我将添加一个小技巧 - 当它基本上等同于 @Model.cvName 时,无需使用 @Html.DisplayFor(model =&gt; model.cvName)。除非你有一些花哨的字符串显示器?

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

您将GET 发送到POST

[HttpPost] 更改为[HttpGet]

或者使用 JQuery 并发送一个 DELETE 动词,就像我在 cmets 中提到的那样

【讨论】:

  • 非常感谢,但是当我尝试这样做时遇到了这个问题,所需的防伪表单字段“__RequestVerificationToken”不存在。,,,
  • 因为你在 GET 上有 ValidateAntiForgeryToken - 你需要决定你在这里做什么。 ValidateAntiForgeryToken 用于在 HTTP POST 中验证 antu CSRF 令牌
  • @Tuta - 删除 [ValidateAntiForgeryToken]。这仅适用于提交表单,不适用于普通链接。
  • 如果您打算使用 GET 执行此操作,则删除 ValidateAntiForgeryToken
【解决方案2】:

您使用的是&lt;a href="@Url.Action("DeleteCV", new { @Model.cvName })"&gt;&lt;/a&gt;,因此您的链接将变为/Controller/DeleteCV?cvName=SomeName,它将作为GET 执行。出于多种原因,您不希望这样做,坦率地说,其余代码也是一团糟。不要在您的视图中执行业务逻辑(例如检查文件),您可能希望围绕 File.Delete() 添加一些检查。

在您的控制器中检查文件,将结果保存在模型变量中,并创建一个单独的表单以 POST 到您的 Delete 方法:

if (@Model.FileExists)
{
    @using(Html.BeginForm("Cv", "DeleteCV", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        @Html.HiddenFor(m => m.cvName)
        <input type="submit" value="Delete" />
    }
}
else
{
    @using(Html.BeginForm("Cv", "UploadCV", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        <input type="file" name="file" accept="pdf" />
        <input type="submit" value="Upload" />
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 2022-01-01
    • 1970-01-01
    • 2018-09-24
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多