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