как показать изображение, не найденное в Asp.net MVC - PullRequest
6 голосов
/ 05 марта 2011

У меня есть проект asp.net mvc.в определенных видах я вызываю четыре изображения из разных папок внутри моего проекта.

иногда изображение не может быть найдено.Я хочу установить изображение для каждой папки, потому что все 4 папки содержат различный размер изображения, поэтому мне нужно установить изображение определенного размера для каждой папки.

как я могу показать изображение по умолчанию, когда изображение ненайти какой-либо способ сделать это. i означает вызывать none.png, когда в каталоге нет изображения, которое я вызывал в представлениях.

- это любой способ показать изображение в случае, когда изображение не найдено.

любой способ сделать это в asp.net 4 MVC 3. с помощью web.config или установки чего-либо еще.

Ответы [ 4 ]

7 голосов
/ 05 марта 2011

Самый простой способ сделать это с помощью помощника HTML. Пожалуйста, помните о дополнительном быстродействии проверки файловой системы, прежде чем даже показывать имя файла изображения. Хотя попадание невелико, поэтому вы не заметите никаких проблем, если не получите очень большой трафик. Затем вы можете реализовать своего рода кэширование, чтобы приложение «знало», существует файл или нет.

Для него вы можете использовать собственный помощник html

public static class ImageHtmlHelpers
{
   public static string ImageUrlFor(this HtmlHelper helper, string contentUrl)
   {
       // Put some caching logic here if you want it to perform better
       UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
       if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl)))
       {
           return urlHelper.Content("~/content/images/none.png");
       }
       else
       {
           return urlHelper.Content(contentUrl);
       }
   }
}

Тогда, по вашему мнению, вы можете просто сделать URL, используя:

<img src="<% Html.ImageUrlFor("~/content/images/myfolder/myimage.jpg"); %>" />

РЕДАКТИРОВАТЬ: Как указал Джим, я на самом деле не решал проблему с размерами. Лично я использую автоматическое управление запросами на размер / размер, что является совсем другой историей, но если вы беспокоитесь о папках / размерах, просто передайте эту информацию для построения пути. Как показано ниже:

public static class ImageHtmlHelpers
{
   public static string ImageUrlFor(this HtmlHelper helper, string imageFilename, ImageSizeFolderEnum imageSizeFolder)
   {
       UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
       string contentUrl = String.Format("~/content/userimages/{0}/{1}", imageSizeFolder, imageFilename);
       if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl)))
       {
           return urlHelper.Content(String.Format("~/content/userimages/{0}/none.png", imageSizeFolder));
       }
       else
       {
           return urlHelper.Content(contentUrl);
       }
   }
}

Тогда, по вашему мнению, вы можете просто сделать URL, используя:

<img src="<% Html.ImageUrlFor("myimage.jpg", ImageSizeFolderEnum.Small); %>" />

Предложили Enum для лучшего программного управления, если папка является фиксированным набором, но для быстрого и неприятного подхода, а не причина, почему вы не можете просто использовать строку, если папка генерируется в дБ и т. Д.

1 голос
/ 23 июня 2011
    public static MvcHtmlString Image(this HtmlHelper helper, string src, string alt)
    {
        var builder = new TagBuilder("img");

        // Put some caching logic here if you want it to perform better
        UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
        if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(src)))
        {
            src = urlHelper.Content("~/content/images/none.png");
        }
        else
        {
            src = urlHelper.Content(src);
        }

        builder.MergeAttribute("src", src);
        builder.MergeAttribute("alt", alt);
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
    }
1 голос
/ 05 марта 2011

Не знаю, сколько всего MVC, но, тем не менее, вот моя идея:

Есть специальный контроллер, который выбирает изображение, основываясь на вашей логике.Как сказал Майкл, что-то (изображение) вернулось при успешной проверке - то есть, если изображение найдено.Если не найдено, верните код состояния 404 или что-то в этом роде.

Обработайте все остальное с помощью JavaScript на клиенте.Поэтому в теге img напишите что-нибудь для события onerror.Может быть, заменить источник img с вашим изображением не найден файл изображения постера.Здесь несколько (но не совсем), как это сделать с помощью jquery.

$(function(){
    $('#myimg').error(function(){
        $('#result').html("image not found");
    });
});

PS: http://jsfiddle.net/Fy9SL/2/, если вас интересует полная демонстрация кода jquery.

0 голосов
/ 05 марта 2011

Вы можете заставить действие контроллера вернуть FileResult и принять параметр типа string, который описывает путь к изображению.

Действие контроллера пытается загрузить изображение с диска и вернуть его как FileResult, или, если файл отсутствует на диске, вместо этого вернуть заполнитель «изображение не найдено».

Затем, чтобы отобразить изображение (или его заполнитель), вы должны установить атрибут src вашего элемента img для действия контроллера, а не для изображения напрямую.

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