首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制器是否有可能以干净的方式返回基于参数的图像?

控制器是否有可能以干净的方式返回基于参数的图像?
EN

Stack Overflow用户
提问于 2011-07-24 21:54:12
回答 2查看 727关注 0票数 3

我试图在ASP ChartDirector中使用图表生成库(ChartDirector)。

ChartDirector正在根据相当大的数据结构生成条形图和HTML。

我正在寻找一种方法:

  1. 直接使用图像而不必将其写入文件
  2. 使用生成的HTML图像映射

我可以生成一个图像并很好地显示它:

代码语言:javascript
复制
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;
}

然后将控制器直接引用到视图中的一个视图中,如下所示:

代码语言:javascript
复制
<img src="/Image/barChart"/>

问题是,我找不到一种很好的方法来获取必要的数据,以便将条形图生成给控制器。

我不能让控制器将图像数据添加到模型中,因为controller.

  • None需要将图像从某个URI中链接-- HTML助手的controller

  • I've似乎允许我向controller

  • I‘ve发送模型,以便生成HTML助手和ImageResult类型,但它不能解决图像映射的问题,而且构建URI的唯一方法-- "BuildUrlFromExpression“--似乎并不存在于MVC3中。

实现这一切的一种方法是将生成图表所需的模型放入TempData,然后调用将使用TempData的控制器,并让控制器将HTML吐入TempData,然后由视图读取。我觉得很难看。

我可能可以通过某种会话ID来存储数据,但这似乎并不好。

我看过(包括):Can an ASP.NET MVC controller return an Image?,但它不适用,因为控制器正在读取一些预先生成的图像。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-24 23:48:23

对我来说,这里的问题是,你试图结合太多的东西(这表明问题实际上有几个不同的问题在其中)。图像请求是与HTML请求不同的请求。从这个角度来看--如果我复制图像URL并发送给其他人,因为我想给他们看图表,而不是页面的其余部分,会发生什么?热连接发生。

为了解决这个问题,当有人点击HTML页面的控制器时,您无法生成图像。当对图表提出第二个请求时,您需要这样做。因此,您的图像请求实际上必须看起来非常类似于对网页本身的请求:它需要在URL中包含足够的信息,以便为图像服务的控制器能够从数据库(或来自何处)获得必要的模型数据,以便生成图表。因此,如果要在上面显示图表的创建网页的控制器操作如下:

代码语言:javascript
复制
public ActionResult Details(int id)

然后,在同一个控制器中,需要另一个操作,如下所示:

代码语言:javascript
复制
public ActionResult DetailsChart(int id)

第二个将获取数据,使用图表库,您必须创建图像,然后返回。你会这样引用它:

代码语言:javascript
复制
<img src="/SomeController/DetailsChart/6" />

这样你就可以得到网页上的图表,或者任何需要它的地方。现在,要在不需要读取磁盘图像的情况下显示它,需要告诉图表控件不要写入磁盘。如果它有另一个MakeChart()来写入Stream,那么就可以使用它了,因为您可以将它写到Response.OutputStream (或者如果您出于某种原因不想立即将它写到HTTP )。

至于ImageMap..。那又是另一回事了。ImageMaps要么放在页面上,根据用户单击的位置告诉浏览器该去哪里,要么在服务器上需要第三个控制器操作才能对图像进行单击并处理它。你不能在发送图像的同时发送,因为这不是图像数据。

票数 0
EN

Stack Overflow用户

发布于 2011-07-24 23:07:58

如果我理解您的问题,您只是在寻找一种方法来向控制器提供模型数据以生成图像?

您的img标记中的URL应该能够像任何其他URL一样包含参数。也就是说,你应该能够:

代码语言:javascript
复制
<img src="/Home/ImageData/4?src=maps" />

它会称这种方法为:

代码语言:javascript
复制
class HomeController
{
    public ActionResult ImageData ( int id, string src )
    {
    }
}

生成视图中的链接只需使用UrlHelper.ActionLink并提供正确的参数即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6810001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档