Проект asp.mvc не загружает изображения

273
04 июня 2017, 17:22

Столкнулся с проблемой на ровном месте:
Мне нужно вывести на страницу график. График я формирую с помощью System.Web.Helpers (объект класса Chart ) и сохраняю в файл на диске. Потом в PartialView через Ajax запрос хочу вывести изображение на страницу. Столкнулся с тем, что проект не выводит изображения. Вообще никакие. Контроллер отрабатывает, изображение на диске - то, которое нужно, а вот в частичное представление я его вывести не могу. Что я делаю не так?

Контроллер (опущен конструктор):

 public ActionResult Index(string url)
    {
        manager = new VMManager();
        manager.VM = (SiteVM)manager.GetVM(url);
        var tempvm = manager.VM;
        return View(tempvm);
    }
    // рисование графика:
   public ActionResult Wrapper (string pattern)
    {
        if (pattern == "test") return null;
        Thread.Sleep(500);
        string param = pattern;
        var PVM = manager.VM.PageResults.FirstOrDefault(x => x.PageAddress == pattern);
        var filepath = @"~/Views/Tool/chart.jpg";
     //   if (System.IO.File.Exists(filepath)) System.IO.File.Delete(filepath);
        var chart = new System.Web.Helpers.Chart(width: 700, height: 300, theme: ChartTheme.Green)
            .AddTitle("Графическое представление времени обработки запроса")
            .AddSeries(
                        name: "graph",
                        chartType: "Line",
                        xValue: new[] { "запрос 1", "запрос 2", "запрос 3", "запрос 4", "запрос 5" },
                        yValues: PVM.AttemptsTime.ToArray())
            // .Write();
            .Save(path: filepath);
        return PartialView("ShowPageResultInChart", new { path = filepath });
    }

Основное представление (фрагменты):
Здесь должен быть выведен график. Это строчка в dive

  @Html.Action("Wrapper", new { pattern = "test" })

Здесь вызывается Ajax-запрос:

 @foreach (var item in Model.PageResults)
    {
        <tr>
            <td>
                @Ajax.ActionLink(item.PageAddress, "Wrapper", new { pattern = item.PageAddress },
             new AjaxOptions
             {
                 UpdateTargetId = "ChartData",
                 LoadingElementId = "LoadingIndicator"
             }
                )
            </td>

Частичное представление - одна строка, тэг img: (даю только внутренности тэга img)
img src="chart.jpg" alt="Graph"

Файл есть, студия его тоже видит. Но на страницу не выводит. Ни Firefox, ни Chrome. Пробовал абсолютный путь не помогло. Пробовал "левый" рисунок (думал, может этот блокируется методом контроллера) - не помогло. В сети ответа тоже не нашел.
Проект создавался как Web->ASP.NET->Empty. Может в настройках проекта что-то включить надо - не знаю

Answer 1

Во-первых. Не складывайте изображения в подпапки для Views. По умолчанию в web.config для папки Views идёт правило:

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>

Поэтому картинку вы там не сможете увидеть. Положите картинку в какую-нибудь другую папку, например, в Content.

Во-вторых о текущем каталоге. Если вы открыли в браузере url https://localhost:12345/Product/Detailed?productID=1 то текущий каталог это никак не ~/Views/Product/ -- а текущий каталог это /Product/ и Views вообще ни при чём, забудьте о нём. Вот если у вас картинка chart.jpg лежит в каталоге /Products то тогда вы можете на странице /Product/Detailed подключать по относительному пути src="chart.jpg". Не уверены? Прописывайте абсолютный url от корня сайта src="/Product/chart.jpg"

И если не уверены, то прописывайте абсолютные url к картинке. А для начала -- просто откройте в браузере url картинки, чтобы увидеть, что она там реально есть.

И ещё, на будущее. Лучше создать сразу виртуальную папку для автоматически сгенерированных картинок. И гит не будет видеть лишние файлы и на реальном хостинге удобно.

READ ALSO
Prop type `children` is invalid; it must be a function, usually from React.PropTypes

Prop type `children` is invalid; it must be a function, usually from React.PropTypes

Использую Gatsby js версии 10 для своего приложения

488
Событие scroll : jquery

Событие scroll : jquery

Имеется блок header, и при скролле, когда header уже не видно, нужно сделать header фиксированным, чтобы его было постоянно видноЯ решил это так:

299
Javascript массив

Javascript массив

Помогите сделать вывод и правильно вписать массивВот задание: Дан массив целых чисел

321
Как сделать гамбургер меню только в мобильной версии?

Как сделать гамбургер меню только в мобильной версии?

Имеется готовый код на jquery, реализующий гамбургер меню в магазине на OpencartНо гамбургер функционирует при любом разрешении экрана, как можно...

673