加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-4 – 在MVC4文件中上传其在DB中保存的“System.Web.

发布时间:2020-12-16 07:40:53 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试使用MVC4进行文件上传,但是在DB中保存对象名称“System.Web.HttpPostedFileWrapper”而不是文件名,即“Songs.MP3”,也不会将文件传输到给定位置. 模型 public class FileUpload{ [Key] public int FileUploadID { get; set; } public int AlbumID
我正在尝试使用MVC4进行文件上传,但是在DB中保存对象名称“System.Web.HttpPostedFileWrapper”而不是文件名,即“Songs.MP3”,也不会将文件传输到给定位置.

模型

public class FileUpload
{
    [Key]
    public int FileUploadID { get; set; }
    public int AlbumID { get; set; }
    public string FileType { get; set; }
    public string FileUploadLocation { get; set; }

    public virtual Albums Albums { get; set; }
}

视图

@using (Html.BeginForm("Create","FileUpload",FormMethod.Post,new { enctype = "multipart/form-data" }))

{

<div class="editor-label">
        @Html.LabelFor(model => model.FileUploadLocation)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.FileUploadLocation,new { type = "file",accept = "FileUploadLocation/*" })
        @Html.ValidationMessageFor(model => model.FileUploadLocation)
    </div>

调节器

//
    // POST: /FileUpload/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(FileUpload fileupload,HttpPostedFileBase FileUploadLocation)
    {
        if (ModelState.IsValid)
        {
            var fileName = Path.GetFileName(FileUploadLocation.FileName);
            var path = Path.Combine(Server.MapPath("~/Images/Files"),fileName);
            FileUploadLocation.SaveAs(path);

            db.FileUploads.Add(fileupload);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.AlbumID = new SelectList(db.Albumss,"AlbumID","AlbumTitle",fileupload.AlbumID);
        return View(fileupload);
    }

文件在?/ Images / Files位置不可用.

解决方法

这里几乎没有问题.第一个问题是命名约定.您的FileUpload模型将FileUploadLocation属性作为字符串,并且在控制器的Create方法中,您将传递FileUpload fileupload模型和HttpPostedFileBase FileUploadLocation.

其他更重要的问题是您不应该将View Model保存到数据库,它应该映射到某种域对象,而这些域对象又会被保存.例如:

创建新的视图模型:

public class FileUploadViewModel
{
    public int FileUploadID { get; set; }
    public int AlbumID { get; set; }
    public string FileType { get; set; }
    public HttpPostedFileBase FileUploadFile { get; set; }

    public virtual Albums Albums { get; set; }
}

从您的域模型中删除虚拟方法:

public class FileUpload
{
    [Key]
    public int FileUploadID { get; set; }
    public int AlbumID { get; set; }
    public string FileType { get; set; }
    public string FileUploadLocation { get; set; }
}

那么你的Controller Create方法应该是这样的:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(FileUploadViewModel model)
{
    if (ModelState.IsValid)
    {
         var fileName = Path.GetFileName(model.FileUploadFile.FileName);
         var path = Path.Combine(Server.MapPath("~/Images/Files"),fileName);
         model.FileUploadFile.SaveAs(path);

         db.FileUploads.Add(new FileUpload
         {
             FileUploadID = model.FileUploadID,AlbumID = model.AlbumID,FileType = model.FileType,FileUploadLocation = path
         });
         db.SaveChanges();
         return RedirectToAction("Index");
    }

        ViewBag.AlbumID = new SelectList(db.Albumss,model.AlbumID);
        return View(model);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读