2011-09-08 2 views
1

FileUpload (microsoft.web.helpers에서)은 EditActionResult 메서드에서 항상 null입니다. Create 메서드에서 제대로 작동합니다. 차이점은 편집을 통해 다른 모델을 통해 원래의 속성에 액세스 할 수 있다는 것입니다. (그것이 의미가있는 경우). 여기 코드를 볼 수 있습니다. 먼저 다음 모델과 컨트롤러 :MVC3 편집 메서드에서 항상 FileUpload (웹 도우미)가 null입니다.

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() 

그래서 분명히 잘못 이해했거나 잘못되었습니다. 어떤 아이디어?

답변

2

name<input type="file"> 요소의 특성에 문제가 있다고 생각됩니다. 예를 들어

는 IT가 (이 작동하기 때문에 나는 가정)과 같다 조치를 만듭니다

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

을 한 후 자동으로 당신의 행동이 소요 만들기 무엇인가 Artikel 클래스의 FileUpload 속성에 바인딩 인수로서.

편집 동작에서 나는 그것이 어떻게 명명되는지 모른다. 그러나 나는 같은 것으로 생각한다. 당신의 편집 작업이 인수로 Files이 걸리기 때문에 그러나이 같은 이름을 지정해야합니다 : 그것은 당신의 Files 모델의 Artikel 속성의 FileUpload 속성에 바인딩됩니다

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

있도록. 또한이 파일 입력을 포함하는 양식에 enctype="multipart/form-data" 속성이 있는지 확인해야합니다.

보기에서 마크 업을 수정하십시오.

+0

Darin을 다시 여는 중입니다. 속성 didnt 도움. 마크 업이 정확합니다. –

+1

@ Kasper Skov, 입력 이름입니다. –

+0

아, 젠장, 그 도우미는 @FileUpload라고 불렀다. 그것은 스스로 FileUpload라는 이름을 생성합니다. 그래서 위선적 인 말은 실제로 그것에 대해 아무 것도하지 않습니다. 내일 모델을 재 설계하는 데 어려움을 겪습니다. 악의에 들으십시오 :) –

관련 문제