我显示了一个从~/Content/Files上传的文件列表,同时也给了用户上传的选项。我试图放置一个删除按钮旁边的每个文件,并允许它只是“无缝”删除,并将其从页面上删除。我不确定我是否在页面上有一个表单,并且我没有在文章中使用该表单,这是否也让我感到困惑。
除了无缝删除的文章外,我还有以下内容:
视图
@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>控制器
[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操作方法:
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方法,然后重新加载视图。
我肯定我在几个不同的地方出了问题。
发布于 2015-02-11 18:39:15
您将请求作为GET请求发送,并且控制器中的操作方法有[HTTPPost]属性装饰该方法。这将只允许POST请求输入此操作方法。你有几个选择。您可以将请求更改为POST请求,该请求将成功地在控制器中找到正确的操作方法。另一种选择是在控制器中删除装饰操作方法的HTTPPost属性。
就个人而言,我建议将请求更改为Http DELETE谓词(因为这是请求的预期操作),然后用HTTPDelete属性修饰方法。
更新:
要将此请求作为HTTP提交,您可以通过更改onclick事件的操作来执行以下操作:
<li style="margin: 10px;">
<a href="@link">@name</a> | <input type="button" value="Delete" class="btn btn-danger" onclick="DeleteRecord(name)">
</li>在您的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调用)的支持。
干杯!
https://stackoverflow.com/questions/28460241
复制相似问题