2011-10-31 37 views
2

我使用ASP.Net與MVC 3並嘗試自動生成圖像。在我看來,我可能會從1到50個圖像(最終可能更多)產生任何東西,這些圖像目前只有一個鏡頭可以丟棄圖像。這是因爲它們顯示了我的數據的當前結果,這些數據得到相當頻繁的更新,所以生成的圖像不能長期依賴。在ASP.NET MVC中自動生成圖像3

當前我在飛行中繪製結果。用戶可以選擇要查看哪些結果,然後如何獲得結果,將圖形寫入文件,然後選取文件名並將其顯示在我的視圖中,但這樣做效果不佳,因爲我不重複使用圖像我只想不打擾他們存儲他們。

到目前爲止,我的解決方案基於以下想法Can an ASP.NET MVC controller return an Image?

在我的控制,我有:

public ActionResult GetImage(GraphData GraphData) 
    { 
     Response.ContentType = "image/png"; 
     using (var ms = new MemoryStream()) 
     { 
      var chart = GraphService.GetChart(GraphData.ResponseItems,GraphData.QuestionDisplaySetup,GraphData.QuestionCutOffs,250,250); 
      chart.SaveImage(ms, ChartImageFormat.Png); 
      ms.Seek(0, SeekOrigin.Begin); 

      return File(ms.ToArray(), "image/png"); 
     } 

    } 

,然後在.cshtml文件:

foreach (var item in @Model.GraphDataList) 
{ 
    <img src="@Url.Action("GetImage", "Download", new { GraphData = item})" alt="" /> 
} 

和模型:

public class GraphData 
{   
    public IEnumerable<ResultItem> ResultItems { get; set; } 
    public ResultDisplaySetup ResultDisplaySetup { get; set; } 
    public IEnumerable<ResultCutOff> ResultCutOffs { get; set; } 
} 

但正如你可能已經猜到了由這個問題不起作用。

如果我做我的.cshtml /視圖:

Html.RenderAction("GetImage", "Download", new { GraphData = filename }); 

然後我皮卡在我的控制器操作的對象沒有任何問題,但我不能使用,在img標籤和ASP.NET MVC null model passed to controller action告訴me @ Url.Action不能發送複雜的對象。

我摔倒了一隻兔子,試圖自己生成序列化對象,並使用RouteValueDictionary和tagbuilder編寫我自己的url生成器,這可能是可能的。一個例子是: Passing an object to HTML attributes

但這個例子太簡單了,很明顯,所以我是因爲我不能完全得到的東西工作。

我有一個額外的複雜性,可能Html.RenderAction不會在已發佈的網站上工作,因爲它不在網站的根目錄(例如/ whatever/MyWebSite),這是出於安全目的,而且太難了立即改變。

無論如何,它似乎是我對框架而不是它的工作。任何想法的人?

謝謝!

+0

你想讓URL看起來像什麼? – SLaks

+0

如果您正在使用GDI +在服務器上繪製圖像,您可以考慮將它轉換爲在本機上以HTML 5在客戶端上繪製它,如果這是一個選項。 –

回答

2

在URL中傳遞複雜對象並不是一個好主意。

取而代之的是,將它們存儲在會話中,在URL中爲會話中的對象傳遞標識符,然後在操作中從會話中讀取它。

+0

除非您可以將模型的構建幾乎完全轉換爲GetImage,否則這是處理它的最佳方法。有一些黑客解決方案喜歡使用[CSS內聯圖像](http://www.websiteoptimization.com/speed/tweak/inline-images/)或[使用putImageData的畫布圖像](http:// www。whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-putimagedata)其中圖像的數據可以在頁面本身發送,但我不會'推薦那些。 –

+0

Session [「someidfortheimage」] =我的視圖 中的GraphData對象,並將操作更改爲public ActionResult GetImage(string id) GraphData GraphData = Session [id];工作過一種享受!謝謝! – user419636