2017-02-01 78 views
-1

大家好,所以我想創建一個應用程序使用asp.net mvc的代碼第一個數據庫,允許用戶能夠上傳和下載圖像到目前爲止我已經得到它來保存到數據庫和顯示器,但我有我的控制器的問題,以解決如何讓用戶下載PDF文件。下載pdf使用asp.net codefirst

目前在控制器中有這些問題

其中強調說PoliciesImageModel不包含其中 的定義。政策加下劃線說不能轉換PoliciesImageModel爲字節

感謝anyhelp這個問題

我正在使用馬茨回答,但PoliciesImages和文件不被認可

查看

@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'語句中引用的相應命名空間將其用作擴展方法。將'使用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

嗨馬特首先感謝您的幫助,但我似乎得到錯誤與單詞文件和在哪裏(我有使用系統。Linq和所有必需的使用語句,並通過點擊ctrl完全檢查)它說PoliciesImageModel不包含定義的地方,其次它說controller.File(byte [],字符串)是一種方法是無效的給定上下文 – WellThisIsAkward

+0

哦,我明白了,所以有兩件事情看起來像。我以前的回答只是解決了「無法將PoliciesImageModel轉換爲字節」。我只是看了一遍。你正試圖在'PoliciesImageModel'上做一個'Where',但它不是'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" })