2011-10-31 39 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