Возможно ли, чтобы контроллер возвращал изображение на основе параметров чистым способом? - PullRequest
3 голосов
/ 25 июля 2011

Я пытаюсь использовать библиотеку генерации диаграмм (ChartDirector) в ASP MVC3.

ChartDirector генерирует гистограмму и карту изображения HTML на основе довольно большой структуры данных.

Я ищу способ:

  1. Использовать изображение напрямую, без необходимости записывать его в файл
  2. Использовать сгенерированную карту 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, которая будет считываться представлением.Мне это кажется удивительно уродливым.

Возможно, я могу хранить данные по какому-то идентификатору сеанса, но это не выглядит намного лучше.

Я смотрел (среди прочих): Может ли контроллер ASP.NET MVC возвращать изображение? , но оно не применяется, поскольку этот контроллер читает предварительно сгенерированное изображение.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Если я понимаю вашу проблему, вы просто ищете способ передачи данных модели в контроллер для использования при генерации изображения?

URL-адрес в вашем теге img должен включать параметрыкак и любой другой URL.То есть вы должны быть в состоянии сделать:

<img src="/Home/ImageData/4?src=maps" />

, и он вызовет этот метод:

class HomeController
{
    public ActionResult ImageData ( int id, string src )
    {
    }
}

Генерация ссылок в представлении будет просто вопросом использования1010 * и предоставляя правильные параметры.

0 голосов
/ 25 июля 2011

Для меня проблема здесь в том, что вы пытаетесь объединить слишком много вещей (что показывает, поскольку вопрос содержит несколько разных вопросов).Запрос изображения является отдельным запросом от запроса HTML.Посмотрите на это так - что произойдет, если я скопирую URL-адрес изображения и отправлю его кому-то еще, потому что я хочу показать им диаграмму, а не остальную часть страницы?Горячее связывание происходит.

Чтобы справиться с этим, вы не можете сгенерировать изображение, когда кто-то нажимает на контроллер для HTML-страницы.Вы должны сделать это, когда второй запрос сделан специально для графика.Таким образом, ваш запрос изображения на самом деле должен выглядеть очень похоже на запрос самой веб-страницы: он должен содержать достаточно информации в URL, чтобы контроллер, обслуживающий изображение, мог получить необходимые данные модели из базы данных (или откуда бы он ни поступил)для того, чтобы сгенерировать диаграмму.Поэтому, если действие контроллера, которое создает веб-страницу, на которой вы хотите отобразить диаграмму, выглядит следующим образом:

public ActionResult Details(int id)

Затем в том же контроллере вам нужно другое действие, подобное этому:

public ActionResult DetailsChart(int id)

второй - получить данные, использовать библиотеку диаграмм, которая вам нужна, чтобы создать изображение, а затем вернуть его.Вы будете ссылаться на него следующим образом:

<img src="/SomeController/DetailsChart/6" />

Таким образом, вы получите график на веб-странице или там, где он был запрошен.Теперь, чтобы отобразить его, не считывая изображение с диска, вы должны указать своему элементу управления диаграммы не записывать на диск.Если у него есть другой MakeChart (), который записывает в Stream, тогда все готово, потому что вы можете записать его в Response.OutputStream (или в MemoryStream, если не хотите сразу записывать его в ответ HTTP).по какой-то причине).

Что касается ImageMap ... это опять другое дело.ImageMaps - это либо HTML-код, размещенный на странице, который сообщает браузеру, куда идти, в зависимости от того, где пользователь нажимает, либо серверный, где вам нужно третье действие контроллера, чтобы щелкнуть изображение и обработать его.Вы не отправляете это одновременно с отправкой изображения, потому что это не данные изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...