2012-07-01 65 views
0

我是MVC(來自面向對象的C#exe應用程序)和Stackoverflow的新手。我一直在努力嘗試使用MVC高效地運行代碼。我有從數據庫返回的Model數據,並且該數據是一個字節字段,它是一個jpeg圖像。在這個階段,我已經打了一個電話到數據庫...渲染圖像已經在視圖中的字節數據

現在我堅持的是,一旦填充的模型數據在視圖中呈現,我不能簡單地遍歷它,在每個數據行中渲染圖像。我發現使它工作的唯一方法是調用和返回FileContentResult的Action方法,但這需要重新爲每個圖像重新調用一次數據庫。

對於解決方案我已經試過了已抓獲了以下問題三種不同的方法:

  1. 我似乎無法通過一個操作方法的字節數組傳回給控制器,以滿足 MVC怎麼想接收 視圖中的FileContentResult。 Action方法只想接受簡單的類型。
  2. 我顯然不想讓控制器回到我已經在視圖中的字節 數據的數據庫,特別是當這個將 涉及我的模型數據中的每個條目的多次往返。
  3. 使用Data Uri工作,但它尚未支持足夠的瀏覽器。

有人能告訴我什麼是處理這種問題的最佳方法嗎?我是否需要解決問題1或問題2,還是有一種我錯過的方法?

這裏是我試圖最初使用在問題1的字節數組傳回給控制器,所以我可以使FileContentResult代碼:

<img src=" @{Html.RenderAction("RenderMemberImage", "Home", new { @pic = x.ThumbnailData });}" /> 

[HttpGet] 
    public FileContentResult RenderMemberImage(byte[] pic) 
    { 
     return new FileContentResult(pic, "mime/jpeg"); 
    } 

回答

0

的問題是,你想送從瀏覽器到服務器的字節數組。嘗試是這樣的:

(我還沒有編譯這一點,但它應該是接近)

<img src=" @{Html.Action("RenderMemberImage", "Home", new { @picId = x.Id });}" /> 

[HttpGet] 
public FileContentResult RenderMemberImage(Guid picId) 
{ 
    var pic = new Models.Picture(picId);//or however you get your data out of the DB 
    return new FileContentResult(pic.ThumbnailData , "mime/jpeg"); 
} 

基本上是頁面上的每個圖像瀏覽器會向服務器請求以獲得圖像。

+0

謝謝你,但我不認爲你看我的後整體。我不想用字節數據回到服務器。我已經有客戶端上的字節數據。我想在客戶端使用它。我試圖找到一種方法,我不必回到數據庫以及Web服務器,但最好是我不想回到服務器。那有意義嗎? – JDev

+0

其實我讀過你的整篇文章,據我所知,除了Data URI方法之外,瀏覽器不支持你嘗試創作的場景。正如你可能知道的那樣,image標籤的'src'屬性將鏈接回服務器上的一個路徑,該路徑返回HttpResponse中的圖像。如果你不想設置你的應用程序來做到這一點,你將游泳上游試圖讓這個工作在多個瀏覽器上。 –

+0

謝謝。就像我在上面回答Shyju有關數據URI一樣,這聽起來像我想做的事情還沒有在網絡世界中做好準備,我需要做的不是將圖像存儲在數據庫中,而是從文件/應用程序服務器標準的http地址。你怎麼看? – JDev

0

一個可行的辦法是將字節轉換爲Base64表示,並保持作爲你的子對象

public class Child 
{ 
    public string ImageURL { set;get;} 
    //other properties & construct etc 
} 
public class Master 
{ 
    IEnumerable<Child> Children { set;get;} 
} 

的財產在你的GET操作

public ActionResult SomeGetACtion() 
{ 
    var master=new Master(); 

    foreach(itm in someCollection) 
    { 
    var child=new Child(); 

    byte[] imageData = GetImageByte(); //get your byte data; 
    string imageBase64 = Convert.ToBase64String(imageData); 
    child.ImageURL = string.Format("data:image/gif;base64,{0}", imageBase64); 
    master.Children.Add(byte); 
    } 
} 

您可以在使用它鑑於這樣的

@foreach(child in Model.Children) 
{ 
    <img src="child.ImageURL" alt="loding.." /> 

} 
+0

是的,這大致就是我在上面提到的問題3中所做的。我想像的數據URI將在未來使用得更多,但現在IE已經落後於「時代」。這聽起來像我需要做的只不是將數據存儲在數據庫中,而是從標準http地址的文件/應用程序服務器提供它們。你們有什麼感想?感謝您的反饋。 – JDev