Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制器是否可以基于参数以干净的方式返回图像?_C#_Asp.net_Asp.net Mvc 3 - Fatal编程技术网

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

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

我正在尝试在ASP MVC3中使用图表生成库(ChartDirector)

ChartDirector正在基于相当大的数据结构生成条形图和HTML图像映射

我正在寻找一种方法:

  • 直接使用图像,无需将其写入文件
  • 使用生成的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"/>
    
    
    
    问题是,我找不到一个好的方法来获取必要的数据,从中可以为控制器构建条形图

    • 我不能让控制器将图像数据添加到模型中,因为HTML 需要从某个URI(控制器)链接映像
    • 似乎没有一个HTML助手允许我向控制器发送模型
    • 我已经研究过制作HTML助手和ImageResult类型,但它并没有解决图像映射的问题,而且我能找到的构建URI的唯一方法“BuildUrlFromExpression”似乎不存在于MVC3中
    我可以完成这一切的一种方法是将生成图表所需的模型放入TempData,然后调用将使用TempData的控制器,并让控制器将HTML图像映射也放入TempData,视图将读取TempData。 对我来说,这看起来非常丑陋

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


    我已经研究过(除其他外):但它不适用,因为该控制器正在读取一些预生成的图像。

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

    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)中。使用它,您只需让视图为图像输出一个键,而检索该键的方法只需将图像从中拉出即可