2013-07-06 2 views
4

Я работаю над сайтом, и я пытаюсь загрузить изображение и сохранить его путь в базе данных.ASP.NET MVC 4 Не удается получить файл из формы

Проблема в том, что я просто не могу получить загруженный файл из формы.

Вот форма,

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Product</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Description) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Description) 
      @Html.ValidationMessageFor(model => model.Description) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Location) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Location) 
      @Html.ValidationMessageFor(model => model.Location) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Condition) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Condition) 
      @Html.ValidationMessageFor(model => model.Condition) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Price) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Price) 
      @Html.ValidationMessageFor(model => model.Price) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.PostedBy) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.PostedBy) 
      @Html.ValidationMessageFor(model => model.PostedBy) 
     </div> 

     <div class="editor-field"> 
      Upload Image <input type="file" name="listingImage" /> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

А вот действие

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Product product, HttpPostedFileBase listingImage) 
    { 
     if (listingImage == null) 
     { 
      return RedirectToAction("Index"); 
     } 
     if (ModelState.IsValid) 
     { 
      db.Products.Add(product); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(product); 
    } 

У меня есть модель для товарной установки, как это.

public class Product 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 
    public string Description { get; set; } 
    public string Location { get; set; } 
    public string Condition { get; set; } 
    public decimal Price { get; set; } 
    public string PostedBy { get; set; } 

    public string PhotoPath { get; set; } 
} 

Теперь каждый раз, когда я заполняю форму и отправляю listingImage, null, и я возвращаюсь к Индексу.

Есть ли что-то, что мне не хватает?

Спасибо.

ответ

2

Вы должны установить тип кодировки своей формы в «multipart/form-data», иначе вы не сможете публиковать файлы.

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

И да, вы можете определить файл отдельно от данных модели и объявить действие контроллера, как вы делали раньше, не нужно включать поле файла в вашей модели класса:

public ActionResult Create(Product product, HttpPostedFileBase listingImage) 
+0

Большое спасибо, это было решение, которое я искал. – jaooe

1

listingImage не является частью вашей модели, а затем не имеет такой же связи, как и остальные свойства Model.xx.

Вы можете обновить Product включить HttpPostedFileBase listingImage и изменить действие контроллера для

public ActionResult Create(Product product) 

В Вашем HTML Вы можете добавить новое свойство, как этот

@using (Html.BeginForm("Create", "Products", FormMethod.Post, new { enctype = "multipart/form-data" })){ @* Forgot this line as Alex Skalozub told in his answer *@ 
@* code omitted *@ 

    <div class="editor-field"> 
     @Html.TextBoxFor(model => model.listingImage, new {type = "file"}) 
    </div> 
} 

Для расположения файла и сохранения можно что-то в строках

var path = Path.Combine(Server.MapPath("~/images/products"),product.listingImage.FileName); 
product.listingImage.SaveAs(path); 
+0

Я попытался включая HttpPostedFileBase в моей модели, но я получил ошибку, аналогичную тому, что в строках «Key не может быть null». – jaooe

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