2017-02-01 20 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" })