首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除不在表单中但在模型中的文件

删除不在表单中但在模型中的文件
EN

Stack Overflow用户
提问于 2015-02-11 17:08:29
回答 2查看 75关注 0票数 1

我显示了一个从~/Content/Files上传的文件列表,同时也给了用户上传的选项。我试图放置一个删除按钮旁边的每个文件,并允许它只是“无缝”删除,并将其从页面上删除。我不确定我是否在页面上有一个表单,并且我没有在文章中使用该表单,这是否也让我感到困惑。

除了无缝删除的文章外,我还有以下内容:

视图

代码语言:javascript
复制
@model IEnumerable<string>

<h2>Files</h2>

<ul>
    @foreach (var fName in Model)
    {
        var name = fName;
        var link = @Url.Content("~/Content/Files/") + name.Replace(" ", "%20");

        <li style="margin: 10px;">
            <a href="@link">@name</a> | <input type="button" value="Delete" class="btn btn-danger" onclick="location.href = '@Url.Action("DeleteFile", "Home", new { fileName = name })'">
        </li>
    }
</ul>

<div>
    @using (Html.BeginForm("Files", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <input type="File" name="file" id="file" value="Choose File" />
        <button type="submit">Upload</button>
    }
</div>

控制器

代码语言:javascript
复制
[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteFile(string fileName)
    {

        string file = fileName;
        string fullPath = Request.MapPath("~/Content/Images/" + file);
        if (System.IO.File.Exists(fullPath))
        {
            System.IO.File.Delete(fullPath);
        }
        return RedirectToAction("Files");
    }

如果您想知道的话,下面是Files操作方法:

代码语言:javascript
复制
public ActionResult Files()
        {
            var path = Server.MapPath("~/Content/Files/");

            var dir = new DirectoryInfo(path);

            var files = dir.EnumerateFiles().Select(f => f.Name);

            return View(files);
        }

它一直试图将我路由到http://localhost:51123/Home/DeleteFile?fileName=test.docx (据我所知,这是因为按钮onclick方法),而我所要做的就是执行Delete方法,然后重新加载视图。

我肯定我在几个不同的地方出了问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-11 18:39:15

您将请求作为GET请求发送,并且控制器中的操作方法有[HTTPPost]属性装饰该方法。这将只允许POST请求输入此操作方法。你有几个选择。您可以将请求更改为POST请求,该请求将成功地在控制器中找到正确的操作方法。另一种选择是在控制器中删除装饰操作方法的HTTPPost属性。

就个人而言,我建议将请求更改为Http DELETE谓词(因为这是请求的预期操作),然后用HTTPDelete属性修饰方法。

更新:

要将此请求作为HTTP提交,您可以通过更改onclick事件的操作来执行以下操作:

代码语言:javascript
复制
<li style="margin: 10px;">
            <a href="@link">@name</a> | <input type="button" value="Delete" class="btn btn-danger" onclick="DeleteRecord(name)">
        </li>

在您的javascript中,您将有这样一个函数:

代码语言:javascript
复制
function DeleteRecord(name) {

$.ajax({
   url: '@Url.Action("DeleteFile", "Home")',
   data: name
   type: 'DELETE',
   success: function(response) {
     //...
   }
});
}

我之所以通过jQuery的ajax函数这样做,是因为HTML表单(直到HTML 4和XHTML 1)只支持GET和POST作为HTTP请求方法。解决这一问题的方法是使用隐藏表单字段通过POST隧道其他方法,该字段由服务器读取并相应地发送请求。

然而,GET、POST、PUT和DELETE在所有主要的web浏览器(IE、Firefox、Opera、Chrome、Safari)中都得到XMLHttpRequest的实现(即AJAX调用)的支持。

干杯!

票数 1
EN

Stack Overflow用户

发布于 2015-02-11 17:21:25

您的文件操作是从内容/文件中获取文件。删除操作试图删除内容/图像中的文件。您需要在两个操作中使用相同的文件夹来显示更改。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28460241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档