2015-10-12 3 views
0

У меня есть поле файла, которое должно использоваться для загрузки изображений и в то же время сохранять путь к файлу в базе данных. Я последовал за этим sample tutorial и адаптировал свой код. Ниже моя модельЗагрузка и сохранение файла в ASP.NET MVC4

using System; 
using System.Web; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace BOL 
{ 
    public class TeamValidation 
    { 
     [Key] 
     public int teamID { get; set; } 

     [Required(ErrorMessage = "Please Enter Your Team Name")] 
     [Display(Name = "Team Name")] 
     public string teamName { get; set; }  

     [DisplayName("Team Picture")] 
     [Required(ErrorMessage = "Please Upload Team Picture")] 
     [ValidateFile] 
     public HttpPostedFileBase teamPicture { get; set; } 
     //public string teamPicture { get; set; } 

     [Required] 
     [Display(Name = "Description")] 
     public string description { get; set; } 

     //[AllowHtml] 
     [Required(ErrorMessage = "Please Enter Team Content")]   
     [Display(Name = "Content")] 
     [MaxLength(200)] 
     public string content { get; set; } 
    } 

    //Customized data annotation validator for uploading file 
    public class ValidateFileAttribute : ValidationAttribute 
    { 
     public override bool IsValid(object value) 
     { 
      int MaxContentLength = 1024 * 1024 * 3; //3 MB 
      string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png" }; 

      var file = value as HttpPostedFileBase; 

      if (file == null) 
       return false; 
      else if (!AllowedFileExtensions.Contains(file.FileName.Substring(file.FileName.LastIndexOf('.')))) 
      { 
       ErrorMessage = "Please upload Your Photo of type: " + string.Join(", ", AllowedFileExtensions); 
       return false; 
      } 
      else if (file.ContentLength > MaxContentLength) 
      { 
       ErrorMessage = "Your Photo is too large, maximum allowed size is : " + (MaxContentLength/1024).ToString() + "MB"; 
       return false; 
      } 
      else 
       return true; 
     } 
    } 

    [MetadataType(typeof(TeamValidation))] 
    public partial class team 
    { 
     [Key] 
     public int teamID { get; set; } 

     public string teamName { get; set; } 

     public string teamPicture { get; set; } 

     public string description { get; set; } 

     public string content { get; set; } 
    } 
} 

и здесь является контроллером

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using BOL; 

namespace TeamBuildingCompetition.Areas.Admin.Controllers 
{ 
    public class TeamController : BaseAdminController 
    { 
     // GET: Admin/Team 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult teamView() 
     { 
      var teamList = objBs.teamBs.GetALL(); 
      return View(teamList); 
     } 

     [HttpPost] 
     public ActionResult Create(team objTeam) 
     { 

      try 
      { 
       if (ModelState.IsValid) 
       { 
        var fileName = Path.GetFileName(objTeam.teamPicture.FileName); 
        var path = Path.Combine(Server.MapPath("~/Content/Upload"), fileName); 
        objTeam.teamPicture.SaveAs(path); 

        TempData["Msg"] = "Created Successfully!"; 
        objBs.teamBs.Insert(objTeam); 
        return RedirectToAction("Index"); 
       } 
       else 
       { 
        return View("Index"); 
       } 
      } 
      catch (Exception e1) 
      { 
       TempData["Msg"] = "Create Failed! :" + e1.Message; 
       return RedirectToAction("Index"); 
      } 
     } 

    } 
} 

У меня есть ошибки в надреза ниже, так что я не смог запустить файл. Ниже волнистая линия ошибки от контроллера:

enter image description here

, а также волнистая линия в модели, как показано ниже:

enter image description here

На зависания над линиями волнистых, я имел это ошибка

Для TeamValidation.cs Ошибка генерирует класс для HttpPostedFileBase

В то время как ошибка на TeamController для волнистой линии .FileName является «строки» не содержит Defination для «FileName», а метод расширения «FileName» принимающего первый arguement типа «строки»

+0

Включили ли вы 'using System.Web;'? –

+0

@StephenMuecke Да ... Я включил систему System.Web и все еще не работает. – Guzzyman

+0

Может видеть это в контроллере, но не в пространстве имен модели :) –

ответ

2

Ваша проблема заключается в использовании а разделяемые классы и атрибут класса team[MetadataType]. Ваша модель данных имеет свойство string teamPicture, и ваш класс метаданных имеет противоречивое свойство HttpPostedFileBase teamPicture. Ваш метод контроллера имеет параметр team objTeam, поэтому objTeam.teamPicture.FileName выдает сообщение об ошибке, поскольку teamPicture является типом string. Чтобы решить эту проблему, удалите атрибут [MetadataType] из вашей модели данных, а также использовать модель представления, чтобы представить то, что вы хотите изменить в представлении

модели данных (в пространстве имен BOL)

public class team 
{ 
    [Key] 
    public int teamID { get; set; } 
    public string teamName { get; set; } 
    public string teamPicture { get; set; } 
    public string description { get; set; } 
    public string content { get; set; } 
} 

Затем создайте новый папку в вашем проекте для модели просмотра (скажем ViewModels).Обратите внимание на teamID не требуется, так как точка зрения для создания новой команды

public class TeamVM 
{ 
    [Required(ErrorMessage = "Please Enter Your Team Name")] 
    [Display(Name = "Team Name")] 
    public string TeamName { get; set; }  
    [DisplayName("Team Picture")] 
    [Required(ErrorMessage = "Please Upload Team Picture")] 
    [ValidateFile] 
    public HttpPostedFileBase TeamPicture { get; set; } 
    [Required] 
    [Display(Name = "Description")] 
    public string Description { get; set; } 
    [Required(ErrorMessage = "Please Enter Team Content")]   
    [Display(Name = "Content")] 
    [MaxLength(200)] 
    public string Content { get; set; } 
} 

Ваш метод GET должен инициализировать и возвращать экземпляр TeamVM

[HttpGet] 
public ActionResult Create() 
{ 
    TeamVM model = new TeamVM(); 
    return View(model); 
} 

и вид будет @model yourAssembly.TeamVM

Затем метод POST будет

[HttpPost] 
public ActionResult Create(TeamVM model) 
{ 
    .... 
    var fileName = Path.GetFileName(model.TeamPicture.FileName); 
    var path = Path.Combine(Server.MapPath("~/Content/Upload"), fileName); 
    model.TeamPicture.SaveAs(path); 
    // map the view model to a new instance of the data model 
    team objTeam = new team 
    { 
    teamName = model.TeamName, 
    teamPicture = path, 
    description = model.Description, 
    content = model.Content 
    }; 
    // save and redirect 
    objBs.teamBs.Insert(objTeam); 
    .... 
} 
+0

@ Guzzyman Это очень хорошее решение для вашей проблемы. Вы должны прочитать несколько статей о шаблоне ViewModel, N-Tier, многоуровневой архитектуре –

+0

@StephenMuecke: Как будет выглядеть мой взгляд? Это будет моя первая работа с View Model. Я адаптировал свой код, и проблем не было. Создание представления - это то, что мне нужно сделать. Я нажал правой кнопкой мыши на Create Action в TeamController для добавления представления, выбрал шаблон для создания, а затем выбрал модель TeamVM, я не смог создать представление. Не могли бы вы прислать мне, как выглядит ваш типичный вид? – Guzzyman

1

You используйте MetadataTypeAttribute и в документации:

Затем вы определяете тип метаданных как обычный класс, за исключением того, что вы объявляете простые свойства для каждого из членов, к которым вы хотите применить атрибуты проверки.

Пример из документации:

[MetadataType(typeof(ProductMetadata))] 
public partial class Product 
{ 
    ... Existing members defined here, but without attributes or annotations ... 
} 

Тогда ваша команда класса должна выглядеть так:

[MetadataType(typeof(TeamValidation))] 
public partial class team 
    { 
     [Key] 
     public int teamID { get; set; } 
     public string teamName { get; set; }  
     public HttpPostedFileBase teamPicture { get; set; } 
     public string description { get; set; } 
     public string content { get; set; } 
    } 
+0

Это именно то, как мой класс команды, но у меня все еще есть squiggly линии, как показано выше. – Guzzyman

+0

Ваш проект не строится сейчас? У вас есть ошибки в окне списка ошибок? –

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