C# 控制器是否可以基于参数以干净的方式返回图像?
我正在尝试在ASP MVC3中使用图表生成库(ChartDirector) ChartDirector正在基于相当大的数据结构生成条形图和HTML图像映射 我正在寻找一种方法:C# 控制器是否可以基于参数以干净的方式返回图像?,c#,asp.net,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc 3,我正在尝试在ASP MVC3中使用图表生成库(ChartDirector) ChartDirector正在基于相当大的数据结构生成条形图和HTML图像映射 我正在寻找一种方法: 直接使用图像,无需将其写入文件 使用生成的HTML图像映射 我可以生成图像并将其显示得很好: public ActionResult barChart() // ImageController { // Code to make chart from hard-coded data var imageBy
public ActionResult barChart() // ImageController
{
// Code to make chart from hard-coded data
var imageBytes = chart.makeChart2(Chart.PNG);
var imageMap = chart.getHTMLImageMap();
FileContentResult byteStream = new FileContentResult(image, "image/png");
return byteStream;
}
然后在其中一个视图中直接引用控制器,如下所示:
<img src="/Image/barChart"/>
问题是,我找不到一个好的方法来获取必要的数据,从中可以为控制器构建条形图
- 我不能让控制器将图像数据添加到模型中,因为HTML 需要从某个URI(控制器)链接映像
- 似乎没有一个HTML助手允许我向控制器发送模型
- 我已经研究过制作HTML助手和ImageResult类型,但它并没有解决图像映射的问题,而且我能找到的构建URI的唯一方法“BuildUrlFromExpression”似乎不存在于MVC3中
我已经研究过(除其他外):但它不适用,因为该控制器正在读取一些预生成的图像。如果我理解您的问题,您只是在寻找一种方法,向控制器提供模型数据以用于生成图像
img
标记中的URL应该能够像任何其他URL一样包含参数。也就是说,您应该能够做到:
<img src="/Home/ImageData/4?src=maps" />
在视图中生成链接只需要使用
UrlHelper.ActionLink
并提供正确的参数。对我来说,这里的问题是您试图组合太多的东西(这表明问题实际上有几个不同的问题)。图像请求是一个独立于HTML请求的请求。这样看-如果我复制图像URL并将其发送给其他人,因为我想向他们显示图表,而不是页面的其余部分,会发生什么?热链接会发生
为了解决这个问题,当有人点击HTML页面的控制器时,您不能生成图像。当第二个请求专门针对图表时,您需要这样做。因此,您的图像请求实际上必须看起来非常类似于对网页本身的请求:它需要在URL中包含足够的信息,以便为图像提供服务的控制器可以从数据库(或来自任何地方)获取必要的模型数据,以生成图表。因此,如果创建要在其上显示图表的网页的控制器操作是:
public ActionResult Details(int id)
然后在同一控制器中,您需要执行以下操作:
public ActionResult DetailsChart(int id)
<img src="/SomeController/DetailsChart/6" />
第二个将获取数据,使用图表库创建图像,然后返回。您将这样引用它:
public ActionResult DetailsChart(int id)
<img src="/SomeController/DetailsChart/6" />
这样你就可以在网页上找到图表,或是从任何需要它的地方找到。现在要显示它而不必从磁盘读取图像,您需要告诉图表控件不要写入磁盘。如果它有另一个MakeChart()可以写入流
,那么您可以这样做,因为您可以将它写入响应.OutputStream
(或者如果出于某种原因不想立即将其写入HTTP响应,则可以写入MemoryStream)
至于影像地图。。。这又是另一回事了。ImageMaps要么是放在页面上的HTML,根据用户单击的位置告诉浏览器去哪里,要么是服务器,在服务器上需要第三个控制器操作来单击图像并处理它。你不能在发送图像的同时发送这些信息,因为这些信息不是图像数据。我有点困惑。澄清一下:您需要一个基于某种模型的网页。在该网页内是一个基于模型中数据的图表图像。您的问题是无法向图表生成器获取必要的数据。是吗?@Tridus:是的,两个问题中有一个是关于将数据传递给图表生成器的,图表生成器是从返回最终图像的模型中调用的。第二,图表生成器不仅构建了一个图像,还构建了一个用于HTML的图像映射。这两个问题都可以通过使用大量通过TempData的数据来解决,但这需要控制器和视图知道另一个使用什么作为密钥。它可以工作,但我要问是否有人有一个干净(或至少更好)的解决方案。注意,我有不同的HTML页面和图像控制器:问题中显示的控制器返回一个FileContentResult(图像字节)。热链接图像将导致空白图像(按原样),因为控制器缺少在基于表单数据的模型中生成的所需数据。分离的一个问题是图像软件同时生成图表和地图,因此将它们分离需要共享/保存大量状态或生成两次图表/地图。这是一个大的图表(高达30000px宽),即使在一个快速的服务器上也需要几秒钟的时间。严格地说,你不需要不同的控制器,你只需要为这两件事使用不同的方法,但这对这个目的来说并不重要。我想这里最好的选择是作为第一个方法的一部分生成图像(当您生成HTML时),或者像现在一样将其写入磁盘,或者将其粘贴到服务器缓存(如HttpContext.cache)中。使用它,您只需让视图为图像输出一个键,而检索该键的方法只需将图像从中拉出即可