MVC3 FileUpload(Web帮助程序)在Edit方法中始终为null

时间:2011-09-08 08:05:18

标签: asp.net-mvc-3 properties entity-framework-4.1 crud

我有一个FileUpload(来自microsoft.web.helpers)在Edit ActionResult方法中始终为空。在Create方法中,它工作正常。唯一不同的是它在Edit中的不同模型,我通过它访问原始属性。 (如果这是有道理的)。这里是代码,你可以看到。首先是模型,然后是控制器:

    public class Files
{
    public int Id { get; set; }
    public List<string> FileName { get; set; }

    public Artikel Artikel { get; set; }
}

public class Artikel
{
    public int Id { get; set; }
    public string Headline { get; set; }
    public string Text { get; set; }]
    public DateTime Date { get; set; }
    public string Author { get; set; }
    public bool Proof { get; set; }
    public IEnumerable<HttpPostedFileBase> FileUpload { get; set; }
    public string TextShort { get { return Text.Substring(0, 50); } }
}

HttpPost创建:

[HttpPost]
        public ActionResult Create(Artikel artikel)
        {
            if (ModelState.IsValid)
            {
                artikel.Date = DateTime.Now;
                db.Artikler.Add(artikel);
                db.SaveChanges();

            foreach (var file in artikel.FileUpload)
            {
                try
                {
                    if (file.ContentLength > 0)
                    {
                        var folder = Server.MapPath("~/uploads/Artikler/" + artikel.Id.ToString());
                        if (!Directory.Exists(folder))
                        {
                            Directory.CreateDirectory(folder);
                        }

                        var fileName = Path.GetFileName(file.FileName);
                        var path = Path.Combine(folder, fileName);
                        file.SaveAs(path);
                    }
                }
                catch (Exception ex)
                {
                    //ex something someting..
                }
            }
            return RedirectToAction("Index");  
        }

        return View(artikel);
    }

编辑:

    public ActionResult Edit(int id)
    {
        var model = new Files
        {
            Artikel = db.Artikler.Find(id),
            FileName = db.GetPictures(id, Server.MapPath("~/uploads/Artikler/"))

        };
        return View(model);
    }

HttpPost编辑:

[HttpPost]
        public ActionResult Edit(Files files)
        {
            if (ModelState.IsValid)
            {
                db.Entry(files.Artikel).State = EntityState.Modified;
                db.SaveChanges();
                if (files.Artikel.FileUpload != null)
                {
                    foreach (var file in files.Artikel.FileUpload)
                    {
                        if (file.ContentLength > 0)
                        {
                            var folder = Server.MapPath("~/uploads/artikler/" + files.Artikel.Id.ToString());
                            if (!Directory.Exists(folder))
                            {
                                Directory.CreateDirectory(folder);
                            }

                        var fileName = Path.GetFileName(file.FileName);
                        var path = Path.Combine(folder, fileName);
                        file.SaveAs(path);
                    }
                }
            }
            return RedirectToAction("Index");
        }
        return View(files);
    }

标记:

@FileUpload.GetHtml()

所以,显然我误解了一些事情,或做错了什么。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我猜问题来自表单上name元素的<input type="file">属性。

例如在“创建”操作中,它看起来像这样(我想因为它有效):

<input type="file" name="FileUpload" />

然后它会自动绑定到FileUpload类的Artikel属性,这是您的Create操作作为参数。

在编辑操作中,我不知道它是如何命名的。但我想也一样。但是因为你的Edit动作以Files为参数,所以必须这样命名:

<input type="file" name="Artikel.FileUpload" />

以便它绑定到FileUpload模型的Artikel属性的Files属性。此外,您应确保包含此文件输入的表单具有enctype="multipart/form-data"属性。

所以在视图中修复你的标记。