Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用asp.net codefirst下载pdf_C#_Asp.net_Asp.net Mvc 4_Pdf_Code First - Fatal编程技术网

C# 使用asp.net codefirst下载pdf

C# 使用asp.net codefirst下载pdf,c#,asp.net,asp.net-mvc-4,pdf,code-first,C#,Asp.net,Asp.net Mvc 4,Pdf,Code First,大家好,我正在尝试使用asp.net mvc创建一个应用程序,其中包含一个代码优先数据库,允许用户上传和下载图像。到目前为止,我已将图像保存到数据库并显示出来,但我的控制器在解决如何允许用户下载pdf文件方面遇到了问题 目前控制器中存在这些问题 where带下划线,表示PolicySimageModel不包含where的定义 . 策略下面加了下划线,表示无法将PoliciesImageModel转换为字节 谢谢你在这个问题上的帮助 更新我正在使用Matts应答,但无法识别警察图像和文件 看法

大家好,我正在尝试使用asp.net mvc创建一个应用程序,其中包含一个代码优先数据库,允许用户上传和下载图像。到目前为止,我已将图像保存到数据库并显示出来,但我的控制器在解决如何允许用户下载pdf文件方面遇到了问题

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

where带下划线,表示PolicySimageModel不包含where的定义 . 策略下面加了下划线,表示无法将PoliciesImageModel转换为字节

谢谢你在这个问题上的帮助

更新我正在使用Matts应答,但无法识别警察图像和文件

看法

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

公共部分类PoliciesPostModel
{
公共警务模式()
{
Pdfs=新列表();
}
[关键]
[HiddenInput(DisplayValue=false)]
公共int ID{get;set;}
[必需(ErrorMessage=“Heading is Required”)]
[显示(Name=“文件名”)]
公共字符串文件名{get;set;}
公共虚拟ICollection PDF{get;set;}
公共IEnumerable文件{get;set;}
}
公共类策略图像模型
{
[关键]
公共int ID{get;set;}
公共字符串路径{get;set;}
公共虚拟策略PostModel{get;set;}
公共字符串DisplayName{get;set;}
}
公共类PoliciesImageVM
{
公共int?ID{get;set;}
公共字符串路径{get;set;}
公共字符串DisplayName{get;set;}
公共布尔被删除{get;set;}
}
公共部分类PoliciesPostVM
{
公共政策ostVM()
{
Pdfs=新列表();
}
公共int?ID{get;set;}
公共字符串文件名{get;set;}
公共IEnumerable文件{get;set;}
公共列表PDF{get;set;}
公共IEnumerable Posts{get;set;}
}
数据库上下文

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....
}
公共类EFDbContext:DbContext
{
#区域政策
公共DbSet PoliciesPosts{get;set;}
公共数据库集策略映像{get;set;}
#端域策略
//其他数据库集也在这里。。。。
}

您正试图返回一个
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;
}

这还没有经过测试。我可能错过了什么。但这是一般的想法。

我最终使用了这段代码,它没有下载它,而是在一个新的选项卡中打开pdf并显示它。 控制器

   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 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");
        }
看法


其中
是LINQ扩展。您需要在
using
语句中引用适当的命名空间,才能将其用作扩展方法。使用System.Linq将
添加到文件顶部。您只能在集合对象上使用
Where
。您的策略变量是ViewModel“PoliciesImageModel”的实例。。因此,您不能执行linq查询。看起来不对劲吗?嗨,马特,首先谢谢你的帮助,但我似乎在单词File和where(我有using system.Linq和所有必需的using语句,并通过点击ctrl-fullstop进行检查)上出现了错误,它说PoliciesImageModel不包含where的定义,其次是controller.File(字节[],string)是一个在给定上下文的情况下无效的方法。哦,我明白了,所以它看起来有两个方面。我之前的回答只是针对“无法将PoliciesImageModel转换为字节”。我只是再看一眼。您正在尝试在
策略图像模型上执行
Where
,但是它不是一个
列表
IEnumerable
或任何东西。嗨,马特再次感谢你的帮助,你已经修复了where位,但有几个问题它说-EFDbContext.PoliciesImages不能像方法一样使用-PoliciesImages找不到-controller.File(字节[],字符串)是一个无效的方法,因为上下文也返回null以绿色下划线表示它不可访问。我应该把它放在else中,也很抱歉麻烦。EntityFramework的实现是不同的,所以我的示例中肯定会有一两个bug,因为我无法真正测试它。现在我正在查看它,我认为您不需要
context.PoliciesImages()。相反,尝试
context.PoliciesImages(不带括号)<代码>PoliciesImages policies=context.PoliciesImages你好,马特,谢谢你的帮助,我知道你不能测试它,只是想让你知道,由于某种原因,它有两个问题,它不能识别第一个policiesImage,文件的事情仍然是一个问题,我想知道是不是因为太policiesImage没有被重新注册要编辑这篇文章的dbcontext部分将帮助任何人找出这个问题是什么,再次感谢你的时间,你一直很有帮助
 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" })