MVC3 FileUpload (веб-помощник) всегда нулевой в методе редактирования - PullRequest
1 голос
/ 08 сентября 2011

У меня есть 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 Ответ

2 голосов
/ 08 сентября 2011

Полагаю, проблема в атрибуте 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".

Так что исправьте вашу разметку в представлении.

...