使用asp.net codefirst下载pdf

时间:2017-02-01 14:37:08

标签: c# asp.net asp.net-mvc-4 pdf code-first

大家好,所以我尝试使用asp.net mvc创建一个应用程序,使用代码第一个数据库,允许用户能够上传和下载图像到目前为止我已经将它保存到数据库并显示但是我我的控制器出了问题,弄清楚如何让用户下载pdf文件。

目前在控制器中存在这些问题

  

其中有下划线说,PoliciesImageModel不包含where的定义   。和策略加下划线说不能将PoliciesImageModel转换为byte

感谢anyhelp解决此问题

  

更新我正在使用Matts答案但是PolicyImages和文件未被识别

查看

 @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....
}

2 个答案:

答案 0 :(得分: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;
}

尚未经过测试。我可能会错过一些东西。但这是一般的想法。

答案 1 :(得分: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" })