2017-02-01 5 views
-1

こんにちは皆、私はasp.net mvcを使用してアプリケーションを作成しようとしています。これは、ユーザーが画像をアップロードしてダウンロードできるようにする最初のデータベースですデータベースとディスプレイに表示されますが、私はコントローラに問題があり、PDFファイルをダウンロードさせる方法を理解しています。asp.net codefirstを使用してpdfをダウンロードする

は、現在コントローラにPoliciesImageModelはどこ の定義が含まれていないと言って下線が引かれているこれらの問題

があります。そして、ポリシーはPoliciesImageModelが

ビューを認識されていない私はMattsの答えが、PoliciesImagesとファイルを使用していますこの問題

アップデートでanyhelpため

感謝をバイトに変換することができないと言って下線が引かれています

@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'ステートメントで参照される適切な名前空間が必要です。ファイルの先頭に 'using System.Linq'を追加してください。そしてコレクションオブジェクトに対してのみ 'Where'を使うことができます。 – mason

+0

あなたのポリシーは、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 fullstopを押すことで確認してください)それはPoliciesImageModelはそれがcontroller.File(バイト[]、文字列)コンテキスト与えられた有効でない方法であると言うどこで、第二の定義が含まれていないと言います – WellThisIsAkward

+0

ああ、私は見るので、2つのことが起こっているように見えます。私の以前の回答は、 "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" }) 
関連する問題