首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件管理器MVC

文件管理器MVC
EN

Stack Overflow用户
提问于 2016-02-19 16:58:10
回答 1查看 1.4K关注 0票数 0

你好,我创建了一个非常简单的文件上传器:

型号:

代码语言:javascript
复制
using System.ComponentModel.DataAnnotations;
using System.Data.Entity.SqlServer;
using System.Linq;
using System.Web;
using System.Web.WebPages.Html;

namespace BestPractices.Models
{
    public class AddPracticeModel
    {
public Guid folder { get; set; } 

[Display(Name = "Attachments:")]
        public IEnumerable<HttpPostedFileBase> Files { get; set; }

    }
}

主计长:

代码语言:javascript
复制
   public ActionResult AddPractice()
        {
              form.folder = Guid.NewGuid();
              return View(form);

        }

    [HttpPost]
            public ActionResult AddPractice(AddPracticeModel formData, string FilePath)
            {
    if (ModelState.IsValid)
                {
                     //Send To DB
                }
    else{

foreach (var files in formData.Files)
            {
                try
                {
                  if (files != null)
                    {

                      var dir = Server.MapPath("/Attachments/" + formData.folder.ToString());
                      if (!Directory.Exists(dir))
                      {
                          System.IO.Directory.CreateDirectory(dir);
                          var fileName = Path.GetFileName(files.FileName);
                          var path = Path.Combine(dir, fileName);
                          files.SaveAs(path);
                      }
                      else
                      {
                          var fileName = Path.GetFileName(files.FileName);
                          var path = Path.Combine(dir, fileName);
                          files.SaveAs(path);
                      }

                    }
                }

                catch
                {

                }

            }
    }
   return View(formData);
        }

因此,我将详细解释这里发生的事情:我为这个表单创建了一个Guid,该Guid将成为一个文件夹,我将在其中存储为该特定实践添加的文件。这样我就可以返回文件夹内容,这样人们就可以下载它们和其他选项。

下面是我的观点:

代码语言:javascript
复制
<div class="formBody">
    @using (Html.BeginForm("AddPractice", "Main", FormMethod.Post, new { enctype = "multipart/form-data", id="myForm" }))
    {
      <div class="inputFields">
                @Html.LabelFor(x => x.Files)
                @Html.TextBoxFor(x => x.Files, new { type = "file", multiple = "true" })

            </div>
<div class="submitButton">
            <input type="submit" value="Submit" onclick="document.getElementById('isRealSubmit').setAttribute('value','True');" />
        </div>
@Html.TextBoxFor(x => x.folder, new { hidden = "true" })

                var dir = Server.MapPath("/Attachments/" + Model.folder.ToString());

                DirectoryInfo d = new DirectoryInfo(dir);
                try { 

                <table>
                    @foreach (var file in d.GetFiles())
                    {
                        var dir2 = Server.MapPath("/Attachments/" + Model.folder.ToString() + "/" + file);
                       <tr>
                           <td><a style="color: red" href="/Attachments/@Model.folder.ToString()/@file" download>@file</a></td>
                           <td>@Html.ActionLink("Delete", "DeleteFile", new { FilePath = dir2 }, new { onclick="var r = confirm('Are you sure you would like to delete?'); if (r == true){document.getElementById('myForm').submit();}", target = "_blank" })</td>
                           @*<a href="#" id="Delete">Delete</a></td>*@
                       </tr>
                    }
                </table>
                }

                catch
                {

                }
    }
</div>

因此,在post中,如果添加了多个文件,它将在文件夹中创建一个当前项的表。然而,讨论了一些问题,第一个问题是表格必须张贴,以便我们能够随时更新添加到文件夹中当前项目表中的新文档。然后删除项目,我必须读取一个名为: DeleteFile的新页面,它只获取url并删除项目,然后刷新主页以显示文件夹中的当前项。但是,DeleteFile在新页面中打开,页面立即关闭。但这可能会让用户感到困惑,因为他们可能会看到一个页面打开,并想知道为什么它关闭这么快,并呼吁支持。

有没有办法在不通过Jquery和Ajax发布的情况下使页面上的文件管理器更新。我在那个领域的知识不是很强,所以这会很有帮助。以及一种无需打开新页面就可以删除项目的方法,然后刷新我们的表单。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-19 17:20:56

您可以使用ajax删除文件。

向用户显示文件的服务器路径可能不是一个好主意(用户可以查看源代码并查看文件夹结构)。您可以只使用文件名(我希望它是唯一的),而不是使用完整的路径。

所以在循环内部,

代码语言:javascript
复制
<table>
@foreach (var file in d.GetFiles())
{
    <tr>
        <td><span>@file</span>
        <a href="@Url.Action("DeleteFile", "Home", 
                  new {fileName = file, folderName= Model.folder})"  class="del">Delete</a>
        </td>    
    </tr>
}
</table>

现在请听此链接上的单击事件。使用jQuery

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

  $("a.del").click(function(e){
   e.preventDefault();

    if(window.confirm("are you sure to delete"))
    {
      var _this=$(this);
      $.post(_this.attr("href"),function(res){
          alert(res.MessagePort);
          if (res.status === "success") {
               _this.closest("tr").remove();   //remove the item from the UI
          }
      });
    }

  });

});

假设在您的DeleteFile中有一个名为HomeController的操作方法,它接受文件路径并删除它。

代码语言:javascript
复制
[HttpPost]
public bool DeleteFile(string filePath,string folderName)
{
     var path = Server.MapPath(Path.Combine("~/Attachments/",folderName, fileName));
     if (System.IO.File.Exists(path))
      {
          System.IO.File.Delete(path);
          return Json( new { status="success", Message= "Deleted successfully"});

      }
      return Json(new { status = "success", Message = "No file!!!!" });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35510643

复制
相关文章

相似问题

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