0

Я пытаюсь загрузить файлы изображений из моей формы вместе с другими полями в моей модели. Моя коллекция HttpPostedFileBase всегда пуста, а число равно 0.HttpPostedFileBase всегда пуст

Я ссылался на многие другие вопросы, связанные с этим в SO, но почему-то я не могу найти решение.

Вид:

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

    <div class="form-horizontal"> 

     @Html.ValidationSummary(true) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Id, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Id) 
       @Html.ValidationMessageFor(model => model.Id) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ProfileId, "ProfileId", new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownList("ProfileId", String.Empty) 
       @Html.ValidationMessageFor(model => model.ProfileId) 
      </div> 
     </div> 


     <div class="form-group"> 
      @Html.LabelFor(model => model.Image1, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="fileuploadImage1" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image2, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="fileuploadImage2" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image3, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="fileuploadImage3" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image4, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="fileuploadImage4" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image5, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="fileuploadImage5" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

Контроллер:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,ProfileId,fileuploadImage1,fileuploadImage2,fileuploadImage3,fileuploadImage4,fileuploadImage5,Files")] HomepageSetting homepagesetting) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       List<String> imagesFilenames = new List<String>(); 
       /*Lopp for multiple files*/ 
       foreach (HttpPostedFileBase file in homepagesetting.Files) 
       { 
        /*Geting the file name*/ 
        string filename = System.IO.Path.GetFileName(file.FileName); 
        /*Saving the file in server folder*/ 
        file.SaveAs(Server.MapPath("~/Images/" + filename)); 
        string filepathtosave = "Images/" + filename; 
        imagesFilenames.Add(filepathtosave); 
       } 


       if(imagesFilenames.Count == 1) 
       { 
        homepagesetting.Image1 = imagesFilenames[0]; 
       } 
       else if (imagesFilenames.Count == 2) 
       { 
        homepagesetting.Image1 = imagesFilenames[0]; 
        homepagesetting.Image2 = imagesFilenames[1]; 
       } 
       else if (imagesFilenames.Count == 3) 
       { 
        homepagesetting.Image1 = imagesFilenames[0]; 
        homepagesetting.Image2 = imagesFilenames[1]; 
        homepagesetting.Image3 = imagesFilenames[2]; 

       } 
       else if (imagesFilenames.Count == 4) 
       { 
        homepagesetting.Image1 = imagesFilenames[0]; 
        homepagesetting.Image2 = imagesFilenames[1]; 
        homepagesetting.Image3 = imagesFilenames[2]; 
        homepagesetting.Image4 = imagesFilenames[3]; 

       } 
       else if (imagesFilenames.Count == 5) 
       { 
        homepagesetting.Image1 = imagesFilenames[0]; 
        homepagesetting.Image2 = imagesFilenames[1]; 
        homepagesetting.Image3 = imagesFilenames[2]; 
        homepagesetting.Image4 = imagesFilenames[3]; 
        homepagesetting.Image5 = imagesFilenames[4]; 
       }      

       ViewBag.Message = "File Uploaded successfully."; 
      } 
      catch 
      { 
       ViewBag.Message = "Error while uploading the files."; 
      } 
      db.HomepageSettings.Add(homepagesetting); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.ProfileId = new SelectList(db.Profiles, "Id", "name", homepagesetting.ProfileId); 
     return View(homepagesetting); 
    } 

Модель:

public partial class HomepageSetting 
{ 
    public int Id { get; set; } 
    //other model properties 

    public string Image1 { get; set; } 
    public string Image2 { get; set; } 
    public string Image3 { get; set; } 
    public string Image4 { get; set; } 
    public string Image5 { get; set; } 

    public virtual Profile Profile { get; set; } 
    public List<HttpPostedFileBase> Files { get; set; } 
    public HomepageSetting() 
    { 
     Files = new List<HttpPostedFileBase>(); 
    } 
} 

Может ли один момент мне к тому, что я делаю неправильно здесь?

ответ

2

Вместо цикла Еогеаспа сделать это таким образом, это происходит с Еогеасп, как я также столкнулся этим вопрос:

for (int i = 0; i < Request.Files.Count; i++) 
{ 
    HttpPostedFileBase myFile = Request.Files[i]; 
} 
+0

Ого .. что сделал трюк ... впустую часов на это :( – Prady

+0

это происходит @Prady я также впустую в моем случае много часов, а потом знать - :) –

+0

Надеюсь .. другие не делают тратить время на это .. Благодаря вашему ответу – Prady

1

В MVC вы всегда должны собственное имя элемента HTML для того, чтобы работать связывание его по умолчанию. В вашем случае управление файловой загрузкой имеет имя, подобное fileuploadImage1, fileuploadImage2 и не присутствующее в вашей модели, поэтому оно не является обязательным.

Предлагаю вам указать все имя элемента загрузки файла.

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

    <div class="form-horizontal"> 

     @Html.ValidationSummary(true) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Id, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Id) 
       @Html.ValidationMessageFor(model => model.Id) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ProfileId, "ProfileId", new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownList("ProfileId", String.Empty) 
       @Html.ValidationMessageFor(model => model.ProfileId) 
      </div> 
     </div> 


     <div class="form-group"> 
      @Html.LabelFor(model => model.Image1, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="files" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image2, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="files" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image3, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="files" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image4, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="files" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Image5, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       <input name="files" type="file" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

Ваше действие вам нужно сделать.

[HttpPost] 
public ActionResult View1([Bind(Include = "Id,ProfileId,fileuploadImage1,fileuploadImage2,fileuploadImage3,fileuploadImage4,fileuploadImage5,Files")] HomepageSetting homepagesetting) 
     { 
      for (int i = 0; i < homepagesetting.Files.Count; i++) 
      { 
       if (homepagesetting.Files[i] != null) 
       { 
       } 
      } 
      return View(); 
     } 
Смежные вопросы