2015-09-23 6 views
0

Я пытаюсь создать проект в aps.net mvc 5, но я не могу сохранить изображение в своем локальном каталоге ... Атрибут: (HttpPostedFileBase ImageUpload) моя сущность (Perfil), всегда равна нулю перевод: English = Profile = PerfilHttpPostedFileBase ImageUpload всегда имеет значение null в asp.net mvc 5

Может кто-нибудь помочь мне, пожалуйста?

. Мой Entity:

[Table("Perfil")] 
public class Perfil 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public int idPerfil { get; set; } 

    [Required] 
    [ForeignKey("Usuario")] 
    public int idUsuario { get; set; } 

    [Required] 
    [ForeignKey("Genero")] 
    public int idGenero { get; set; } 

    [DisplayName("Descrição:")] 
    public string descricao { get; set; } 

    public string linkMultimidia { get; set; } 

    [DataType(DataType.ImageUrl)] 

    public string ImageUrl { get; set; } 

    [DataType(DataType.Upload)] 
    [NotMapped] 
    public HttpPostedFileBase ImageUpload { get; set; } 

    public virtual Usuario Usuario { get; set; } 

    public virtual Genero Genero { get; set; } 
} 

}

Мой контроллер:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "idPerfil,idUsuario,idGenero,descricao,linkMultimidia,fotoPerfil")] Perfil perfil) 
    { 
     var validImageTypes = new string[] 
     { 
      "image/gif", 
      "image/jpeg", 
      "image/pjpeg", 
      "image/png" 
     }; 

     if (perfil.ImageUpload == null || perfil.ImageUpload.ContentLength == 0) 
     { 
      ModelState.AddModelError("ImageUpload", "This field is required"); 
     } 
     else if (!validImageTypes.Contains(perfil.ImageUpload.ContentType)) 
     { 
      ModelState.AddModelError("ImageUpload", "Please choose either a GIF, JPG or PNG image."); 
     } 

      if (ModelState.IsValid) 
      { 
       if (perfil.ImageUpload != null && perfil.ImageUpload.ContentLength > 0) 
       { 
        var uploadDir = "~/Imagens"; 
        var imagePath = Path.Combine(Server.MapPath(uploadDir), perfil.ImageUpload.FileName); 
        var imageUrl = Path.Combine(uploadDir, perfil.ImageUpload.FileName); 
        perfil.ImageUpload.SaveAs(imagePath); 
        perfil.ImageUrl = imageUrl; 
       } 

        rep.IncluirPerfil(perfil); 
        return RedirectToAction("Index"); 
      } 

     ViewBag.idGenero = new SelectList(db.Generos, "idGenero", "nomeGenero", perfil.idGenero); 
     ViewBag.idUsuario = new SelectList(db.Usuarios, "idUsuario", "nome", perfil.idUsuario); 
     return View(perfil); 
    } 

Моя страница Фото:

<div class="form-group"> 
     @using (Html.BeginForm("Create", "PerfilController", FormMethod.Post, new { enctype = "multipart/form-data" })) 
      { 
      <div class="col-md-10"> 
       @Html.LabelFor(model => model.ImageUpload) 
       </div> 
       @Html.TextBoxFor(model => model.ImageUpload, new { type = "file" }) 
      }    
     </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> 

Я попробовал другие решения, но по-прежнему нулевой ...

+0

не уверен, что если ваши примеры кода правильно .. но вы r submit не входит даже в вашу форму, а 'ImageUpload' не находится в вашем' [Bind (Include)] 'list – JamieD77

+0

может помочь, если вы разместите свой весь Create view – JamieD77

+0

. Вы не только отправляете кнопку вне формы, вы специально исключаете файл от привязки в вашем атрибуте '[Bind]'. –

ответ

1

Предложить но т должны быть внутри блока using:

<div class="form-group"> 

    @using (Html.BeginForm("Create", "Home", FormMethod.Post, new {enctype = "multipart/form-data"})) 
    { 
     @Html.AntiForgeryToken() 
     <div class="col-md-10"> 
      @Html.LabelFor(model => model.ImageUpload) 
     </div> 
     @Html.TextBoxFor(model => model.ImageUpload, new {type = "file"}) 
     <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> 

Также добавьте ImageUpload в Bind список:

public ActionResult Create([Bind(Include = "idPerfil,idUsuario,idGenero,descricao,linkMultimidia,fotoPerfil, ImageUpload")] Perfil perfil) 

более вещь Один из них, вы можете использовать Exclude вместо Include в вашем случае.

+0

видел то же самое, но почти похоже, что у него может быть 2 формы, а форма ImageUpload находится внутри другой формы. – JamieD77

+0

Да, кстати, вам нужно что-то разместить в этом блоке 'using'. –

+0

Tnks Sirwan, но это все равно null ... В моем контроллере * perfil.ImageUpload == null * –

0

Я решил!

Entity:

public string photoPath{ get; set; } 

Контроллер:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "idPerfil,idUsuario,idGenero,descricao,linkMultimidia,photoPath")] Perfil perfil) 
{ 
    string filename = perfil.photoPath; 

    var uploadDir = "~/Imagens"; 
    var imagePath = Path.Combine(Server.MapPath(uploadDir), filename); 
    var imageUrl = Path.Combine(uploadDir, filename); 
    perfil.photoPath = imageUrl; 

    if (ModelState.IsValid) 
    { 
     rep.IncluirPerfil(perfil); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.idGenero = new SelectList(db.Generos, "idGenero", "nomeGenero", perfil.idGenero); 
    ViewBag.idUsuario = new SelectList(db.Usuarios, "idUsuario", "nome", perfil.idUsuario); 
    return View(perfil); 
} 

Создать Вид:

<div class="form-group"> 
    @Html.LabelFor(model => model.photoPath, new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.TextBoxFor(model => model.photoPath, new { type = "file" }) 
     @Html.ValidationMessageFor(model => model.photoPath) 
    </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> 
+0

Это именно то, что объясняет ответ Sirwan Afifi (только лучше), так почему вы добавили это вместо того, чтобы принять этот ответ? –

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