2013-03-18 4 views
1

Я работаю над приложением в ASP.Net MVC 4 и пытаюсь загрузить изображение в форму. Проблема, с которой я столкнулся, заключается в том, что когда сообщения формы, если <input type="file"... пуст (что означает, что я не выбрал файл), сообщения в форме просто отлично, и все работает. Однако, когда я выбираю файл, форма просто сидит там и ничего не делает.при использовании формы enctype = "multipart/form-data" не отправляет

Сначала я подумал, что это просто требуется некоторое время для загрузки, но я оставил его на некоторое время (размер файла был 7kb) и ничего. отладчик даже не ударил точки останова в начале действия. Я в растерянности, так как я совершенно новичок в платформе и все еще учился каждый день. Ниже приведен весь необходимый код:

Вид:

@using (Html.BeginForm("StaffInformation", "Manager", FormMethod.Post, new { @class = "form-horizontal", enctype = "multipart/form-data"})) 
      { 
       @Html.AntiForgeryToken() 
       @Html.ValidationSummary(true) 
       <div class="control-group"> 
        @Html.LabelFor(model => model.firstName, new { @class = "control-label" }) 
        <div class="controls"> 
         @Html.TextBoxFor(model => model.firstName, new { @class = "span12" }) 
         @Html.ValidationMessageFor(model => model.firstName) 
        </div> 
       </div> 

       <div class="control-group"> 
        @Html.LabelFor(model => model.lastName, new { @class = "control-label" }) 
        <div class="controls"> 
         @Html.TextBoxFor(model => model.lastName, new { @class = "span12" }) 
         @Html.ValidationMessageFor(model => model.lastName) 
        </div> 
       </div> 

       <div class="control-group"> 
        Staff Photo: 
        <div class="controls"> 
         @if (Model.staffImage == null) 
         { 
          @:None 
         }else{ 
         <img width="150" height="150" src="@Url.Action("GetImage", "Manager", new { Model.staffProfileID })" /><br /> 
         } 
         <input type="file" id="staffImage" name="staffImage" data-provide="fileinput"> 
        </div> 
       </div> 

       <div class="form-actions"> 
        <button type="submit" class="btn btn-primary">Save changes</button> 
        <a href="@Url.Action("dashboard", "manager")" class="btn" type="reset" >Cancel</a> 
       </div> 
      } 

Действие:

public ActionResult StaffInformation(StaffInformationViewModel model, HttpPostedFileBase staffImage) 
    { 
    if (ModelState.IsValid) //This is where the breakpoint is 
     { 
      if (staffImage != null) { 
       model.imageMimeType = staffImage.ContentType; 
       model.staffImage = new byte[staffImage.ContentLength]; 
       staffImage.InputStream.Read(model.staffImage, 0, staffImage.ContentLength); 
      } 

      using (var repo = new CompanyInformationRepository(new UniteOfWorkCompanies())) 
      { 
       var company = repo.FindCompany(User.Identity.Name); 

       repo.AddOrUpdateStaff(model, company); 
      } 

      return RedirectToAction("ManageStaff"); 
     } 
    } 

Я действительно не знаю, что происходит, и просто причина Я использую enctype = "multipart/form-data" - это потому, что я читал «Про ASP.NET MVC 4» Адама Фримена, и там они сказали, что без него он не будет работать. Как я уже сказал, я совершенно новый, и мне нужна вся помощь, которую я могу получить.

ответ

2

Вы можете попробовать поставить HttpPostedFileBase staffImage как часть вашего ViewModel (StaffInformationViewModel) - тоже да, вы должны держать enctype = "multipart/form-data" в виде тега:

public class StaffInformationViewModel 
{ 
    // your other properties here ... 

    [Required] 
    public HttpPostedFileBase StaffImage { get; set; } 
} 

Тогда в представлении:

@Html.TextBoxFor(model => model.StaffImage, new { type = "file" }) 

Тогда в контроллере:

public ActionResult StaffInformation(StaffInformationViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      if (model.StaffImage != null) 
      { 
       // awesome 
      } 
      // ... more awesome 
     } 
    } 

I ч Это помогает. Дайте мне знать, если вам нужно больше разъяснений здесь, на этом ...

+0

Привет, Димитар, я не могу создать свойство типа HttpPostedFileBase внутри моего проекта модели. Я попытался добавить ссылку на файл system.web.http (который, как мне кажется, он живет), но он все еще не способен его распознать. Мои модели находятся в отдельном проекте в качестве моего веб-проекта mvc. – hjavaher

+0

Ваши модели могут быть в отдельном проекте, но я полагаю, что ваши ViewModels не должны (по крайней мере, это общее соглашение), поэтому есть ViewModels и Models. В любом случае, я верю, что HttpPostedFileBase находится в System.Web, если вы хотите ссылаться на него. –

+0

ах ок, я думал, что они все будут сидеть в одном месте для организации, но, как я уже сказал, я совершенно новый. Я ссылался на system.web, system.web.http и добавил ссылку на system.web.Abstractions без везения. Должен ли я включать viewmodel внутри моего веб-проекта, чтобы это работало? – hjavaher

Смежные вопросы