2016-06-21 7 views
4

MVC Webグリッドにダウンロード機能を実装しようとしています。ここにデモコードがあります。ここでは、このコードでBase64 Stringを使用してMVC Webgridで問題をダウンロードしてください。

モデル

public class Student 
    { 
     public string Name { get; set; } 
     public string Address { get; set; } 

     public string ByteArray { get; set; } 

     public List<Student> StudentList { get; set; } 

    } 

ビュー

@model Fileuploaddemo.Models.Student 

    @{ var grid = new WebGrid(Model.StudentList);} 

    @Html.LabelFor(model => model.Name) 
    @Html.EditorFor(model => model.Name) 

    @Html.LabelFor(model => model.Address) 
    @Html.EditorFor(model => model.Address) 

    @grid.GetHtml(   
        htmlAttributes: new 
        { 
         id = "gridT1", 
         @calss = "" 
        }, 
    tableStyle: "webgrid-table", 
    headerStyle: "webgrid-header",   
    columns: grid.Columns(
    grid.Column(columnName: "Name", header: "Name"), 
    grid.Column(columnName: "Address", header: "Address"))) 

コントローラ

public ActionResult Index() 
     { 
      Student obj = new Student(); 
      obj.StudentList = new List<Student>(); 
      return View(obj); 

     } 
     [HttpPost] 
     public ActionResult Index(Student obj, HttpPostedFileBase file1) 
     { 
      if (file1 != null) 
      { 
       MemoryStream target = new MemoryStream(); 
       file1.InputStream.CopyTo(target); 
       byte[] data = target.ToArray(); 
       obj.ByteArray = Convert.ToBase64String(data); 
      } 

      obj.StudentList = new List<Student>(); 
      obj.StudentList.Add(obj); 
      return View(obj); 

     } 

、私はdisplにしようとしていますMVC Webグリッド内のStudentの詳細とファイルダウンロードオプション。

ここでは、ファイルをダウンロードする方法がわかりません。これは、base64string形式です。

問題の解決にお手伝いをしてください。

ありがとうございました。

答えて

0

WebGridに追加の列を追加する必要があります。この列には、「ダウンロード」というリンクがあります。このリンクは、コントローラでダウンロードアクションを呼び出し、クリックされたstudent.Belowのbase64プロパティを通過する必要があります例を作業、それはあなたを助け願っています:

コントローラー:

public class StudentController : Controller 
{ 
    public ActionResult Index() 
    { 
     Student obj = new Student(); 
     byte[] bytes = System.IO.File.ReadAllBytes("F:\\test.txt"); 
     string ba = Convert.ToBase64String(bytes); 

     var s1 = new Student { Name = "Student1", Address = "Address1", ByteArray = ba }; 
     var s2 = new Student { Name = "Student2", Address = "Address2", ByteArray = ba }; 
     var s3 = new Student { Name = "Student3", Address = "Address3", ByteArray = ba }; 

     obj.StudentList = new List<Student>() { s1, s2, s3 }; 
     return View(obj); 
    } 

    [HttpGet] 
    public FileResult DownloadAction(string file) 
    { 
     byte[] fileBytes = Convert.FromBase64String(file); 
     string fileName = "test.txt"; 
     return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 
    } 
} 

ビュー:

@model Fileuploaddemo.Models.Student 

@{ var grid = new WebGrid(Model.StudentList);} 

@Html.LabelFor(model => model.Name) 
@Html.EditorFor(model => model.Name) 

@Html.LabelFor(model => model.Address) 
@Html.EditorFor(model => model.Address) 


@grid.GetHtml(
        htmlAttributes: new 
        { 
         id = "gridT1", 
         @calss = "" 
        }, 
    tableStyle: "webgrid-table", 
    headerStyle: "webgrid-header", 
    columns: grid.Columns(
    grid.Column(columnName: "Name", header: "Name"), 
    grid.Column(columnName: "Address", header: "Address"), 
    grid.Column("Download", "Download", format: @<text> 
     @Html.ActionLink("Download", "DownloadAction", "Student", new { file = item.ByteArray },null) 
    </text>) 
    )) 
+0

私はこれを試しましたが、ファイルがBase64string形式で保存されているため、actionlinkのルーティング値としてファイルを渡すことができません。 –

+0

なぜでしょうか?私は上記の例で通り抜けていますが、うまくいきます。とにかく、レコードのIDをコントローラに渡すことができ、コントローラではIDを使ってbase64文字列を検索し、ダウンロード、それは本当にシンプルです。ちょうど学生クラスにIDプロパティを追加し、ActionLinkをHtml.ActionLink( "Download"、 "DownloadAction"、 "Student"、new {id = ID}、null)に変更してください –

関連する問題