我试图在ASP ChartDirector中使用图表生成库(ChartDirector)。
ChartDirector正在根据相当大的数据结构生成条形图和HTML。
我正在寻找一种方法:
我可以生成一个图像并很好地显示它:
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"/>问题是,我找不到一种很好的方法来获取必要的数据,以便将条形图生成给控制器。
我不能让控制器将图像数据添加到模型中,因为controller.
实现这一切的一种方法是将生成图表所需的模型放入TempData,然后调用将使用TempData的控制器,并让控制器将HTML吐入TempData,然后由视图读取。我觉得很难看。
我可能可以通过某种会话ID来存储数据,但这似乎并不好。
我看过(包括):Can an ASP.NET MVC controller return an Image?,但它不适用,因为控制器正在读取一些预先生成的图像。
发布于 2011-07-24 23:48:23
对我来说,这里的问题是,你试图结合太多的东西(这表明问题实际上有几个不同的问题在其中)。图像请求是与HTML请求不同的请求。从这个角度来看--如果我复制图像URL并发送给其他人,因为我想给他们看图表,而不是页面的其余部分,会发生什么?热连接发生。
为了解决这个问题,当有人点击HTML页面的控制器时,您无法生成图像。当对图表提出第二个请求时,您需要这样做。因此,您的图像请求实际上必须看起来非常类似于对网页本身的请求:它需要在URL中包含足够的信息,以便为图像服务的控制器能够从数据库(或来自何处)获得必要的模型数据,以便生成图表。因此,如果要在上面显示图表的创建网页的控制器操作如下:
public ActionResult Details(int id)然后,在同一个控制器中,需要另一个操作,如下所示:
public ActionResult DetailsChart(int id)第二个将获取数据,使用图表库,您必须创建图像,然后返回。你会这样引用它:
<img src="/SomeController/DetailsChart/6" />这样你就可以得到网页上的图表,或者任何需要它的地方。现在,要在不需要读取磁盘图像的情况下显示它,需要告诉图表控件不要写入磁盘。如果它有另一个MakeChart()来写入Stream,那么就可以使用它了,因为您可以将它写到Response.OutputStream (或者如果您出于某种原因不想立即将它写到HTTP )。
至于ImageMap..。那又是另一回事了。ImageMaps要么放在页面上,根据用户单击的位置告诉浏览器该去哪里,要么在服务器上需要第三个控制器操作才能对图像进行单击并处理它。你不能在发送图像的同时发送,因为这不是图像数据。
发布于 2011-07-24 23:07:58
如果我理解您的问题,您只是在寻找一种方法来向控制器提供模型数据以生成图像?
您的img标记中的URL应该能够像任何其他URL一样包含参数。也就是说,你应该能够:
<img src="/Home/ImageData/4?src=maps" />它会称这种方法为:
class HomeController
{
public ActionResult ImageData ( int id, string src )
{
}
}生成视图中的链接只需使用UrlHelper.ActionLink并提供正确的参数即可。
https://stackoverflow.com/questions/6810001
复制相似问题