2017-02-01 7 views
-1

Привет всем, поэтому я пытаюсь создать приложение с использованием asp.net mvc с первой базой данных кода, которая позволяет пользователям загружать и загружать изображения, пока я их сохранил в базу данных и отображение, но у меня возникают проблемы с моим контроллером, чтобы выяснить, как разрешить пользователю загружать PDF-файл.Загрузить pdf с помощью asp.net codefirst

В настоящее время в контроллере есть эти вопросы

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

Спасибо за anyhelp с этим вопросом

Обновление Я использую MATTS ответ, но PoliciesImages и файл не распознается

View

@model List<MyProject.Models.PoliciesPostVM> 
@foreach (var item in Model) 
{ 
@Html.DisplayFor(modelItem => item.FileName) 
@Html.ActionLink("Download", "PoliciesDownload", new { id = item.ID}) 
} 

Контролер

public FileContentResult PoliciesDownload(int ID) 
    { 
     if (ID == 0) { return null; } 
     PoliciesImageModel policies = new PoliciesImageModel(); 

     policies = policies.Where(a => a.ID == ID).SingleOrDefault(); 
     return File(policies, "application/pdf"); 
    } 

модель

public partial class PoliciesPostModel 
    { 
     public PoliciesPostModel() 
    { 
      Pdfs = new List<PoliciesImageModel>(); 
    } 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    public int ID { get; set; } 
    [Required(ErrorMessage = "Heading is Required")] 
    [Display(Name = "File Name")] 
    public string FileName { get; set; } 
    public virtual ICollection<PoliciesImageModel> Pdfs { get; set; } 
    public IEnumerable<HttpPostedFileBase> File { get; set; } 
} 

public class PoliciesImageModel 
    { 
    [Key] 
    public int ID { get; set; } 
    public string Path { get; set; } 
    public virtual PoliciesPostModel Post { get; set; } 
    public string DisplayName { get; set; } 
} 
public class PoliciesImageVM 
    { 
    public int? ID { get; set; } 
    public string Path { get; set; } 
    public string DisplayName { get; set; } 
    public bool IsDeleted { get; set; } 
} 
public partial class PoliciesPostVM 
    { 
    public PoliciesPostVM() 
    { 
      Pdfs = new List<PoliciesImageVM>(); 
    } 

    public int? ID { get; set; } 
    public string FileName { get; set; } 
    public IEnumerable<HttpPostedFileBase> Files { get; set; } 
    public List<PoliciesImageVM> Pdfs { get; set; } 
    public IEnumerable<PoliciesPostModel> Posts { get; set; } 
} 

DbConext

public class EFDbContext: DbContext 
{ 
    #region Policies 
    public DbSet<PoliciesPostModel> PoliciesPosts { get; set; } 
    public DbSet<PoliciesImageModel> PoliciesImages { get; set; } 
    #endregion Policies 
    //other Dbsets are here too.... 
} 
+0

'Where' является расширением LINQ. Для использования его в качестве метода расширения вам нужно соответствующее пространство имен, указанное в инструкции 'using'. Добавьте 'using System.Linq' в начало файла. И вы можете использовать 'Where' только для объектов коллекции. – mason

+0

Ваши политики var являются экземпляром ViewModel «PoliciesImageModel» .. поэтому вы не можете выполнить запрос linq. Не выглядит правильно? – Wheels73

ответ

1

Вы пытаетесь вернуть FileContentResult. Это всего лишь массив байтов (и это именно то, что PDF-файл). Вам нужно будет использовать свойство Path для поиска на диске и получения содержимого PDF-файла в массив байтов. Затем поток этого массива из вместо того, чтобы вашего PoliciesImageModel

Кроме того, вы создаете новый, индивидуальный PoliciesImageModel объекта, а не список PoliciesImageModel из базы данных. Вам нужно будет получить список из контекста базы данных и сделать фильтр в этом списке.

public ActionResult PoliciesDownload(int ID) 
{ 
    if (ID == 0) { return null; } 
    using (var context = new DBContext()) { 
     PoliciesImages policies = context.PoliciesImages; 
     var policy = policies.Where(a => a.ID == ID).SingleOrDefault(); 
     byte[] fileBytes = File.ReadAllBytes(policies.Path); 
     Response.AddHeader("Content-Disposition", "inline; filename=policies.DisplayName + ".pdf"); 
     return File(fileBytes , "application/pdf"); 
    } 
    return null; 
} 

Это еще не проверено. Я, наверное, что-то пропускаю. Но это общая идея.

+0

Привет, Matt сначала спасибо за вашу помощь, но я, кажется, получаю ошибки со словами File и где (у меня есть система.Linq и все необходимые операторы и проверки, нажав ctrl fullstop на них), он говорит, что PoliciesImageModel не содержит определения для того, где и во-вторых, он говорит controller.File (byte [], string) - это метод, который недопустим с учетом контекста – WellThisIsAkward

+0

О, я вижу, так происходит две вещи. Мой предыдущий ответ просто обратился к «не может преобразовать PoliciesImageModel в байт». Я просто снова посмотрел. Вы пытаетесь сделать 'Where' на' PoliciesImageModel', но это не 'List' или' IEnumerable' или что-то еще. –

+0

Проверьте мой обновленный ответ и посмотрите, поможет ли это вам. –

0

Я закончил использовать этот код, который он не скачал, но вместо этого открывает PDF-документ на новой вкладке и отображает его. контроллер

public ActionResult PoliciesDownload(int ID) 
     { 
      if (ID == 0) { return null; } 
      PoliciesImageModel resume = new PoliciesImageModel(); 
      EFDbContext rc = new EFDbContext(); 
      resume = rc.PoliciesImages.Where(a => a.ID == ID).SingleOrDefault(); 
      return File(resume.Path, "application/pdf"); 
     } 

Посмотреть

 @Html.ActionLink("View Pdf", "PoliciesDownload", new { id = item.ID }, new { @target = "_blank" })