删除MVC5中的上传文件?

时间:2015-02-12 12:32:50

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

我正在使用MVC5项目,我创建了一个简单的系统,用户可以上传文件" CV"为每个员工。 现在,除了" DELETING File"之外,所有事情对我都很好。 我需要添加删除上传文件的操作方法以及用另一个文件替换它的功能。

在模型类中我创建了两个属性HttpPostedFileBase CV来保存上传的文件 和String 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.您正在查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。

     

请求的网址:/ DeleteCV

2 个答案:

答案 0 :(得分:7)

您正在向GET

发送POST

[HttpPost]更改为[HttpGet]

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

答案 1 :(得分:1)

您正在使用<a href="@Url.Action("DeleteCV", new { @Model.cvName })"></a>,因此您的链接将变为/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" />
    }
}