Элемент управления ashx возвращает изображение, jquery получает размер при загрузке или методы .NET OnLoad не работают

У меня есть обработчик ASHX, возвращающий изображение при загрузке страницы. Мне нужно добавить класс к изображению динамически в зависимости от размеров изображения. Я пробовал делать это следующими способами:

Метод скрытого кода

cs

protected void Page_Load(object sender, EventArgs e)
{
    int id = Convert.ToInt32(Request.QueryString["id"]);
    image1.ImageUrl = "get_image.ashx?id=" + id;
}

public void classify_image_Load(object sender, EventArgs e)
{
    if(image1.Width.Value > image1.Height.Value)
    {
        image1.CssClass = "landscape";
    }
    else
    {
        image1.CssClass = "portrait";
    }
}

html

<asp:Image ID="image1" runat="server" OnLoad="classify_image_Load" />

Это работает при начальной загрузке, однако при любых обратных передачах (загрузка нового изображения / поворот / обрезка) он не может правильно применить класс.

Метод jQuery

js

$(window).load(function(){

    $('#image1').load(function() {
        if($(this).width() > $(this).height())
        {
            $(this).attr('class', 'landscape');
        } else {
            $(this).attr('class', 'portrait');
        }
    });

});

Этот метод вообще не работает, изображение не имеет назначенного ему класса. Я не уверен, что это проблема с синхронизацией с управлением ashx или чем-то еще.

Код ASHX

public class get_image : IHttpHandler
{
    string file_path = ConfigurationManager.AppSettings["file_path"].ToString();
    public void ProcessRequest(HttpContext context)
    {
        context.Response.Clear();
        Image img;
        if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
        {
            int id;
            if (context.Request.QueryString["id"].IndexOf('?') > 0)
            {
                id = Int32.Parse(context.Request.QueryString["id"].Split('?')[0]);
            }
            else
            {
                id = Int32.Parse(context.Request.QueryString["id"]);
            }

            dbclassDataContext db = new dbclassDataContext();
            photo d = (from p in db.photos
                       where p.id == id
                       select p).SingleOrDefault();

            if (d != null)
            {
                if (!String.IsNullOrEmpty(d.filename))
                {
                    img = Image.FromFile(file_path + "\\" + d.filename);
                    context.Response.ContentType = "image/" + d.filetype;
                    img.Save(context.Response.OutputStream, get_format(d.filetype));
                }
                else
                {
                    img = Image.FromFile(file_path + "\\no_image.jpg");
                    context.Response.ContentType = "image/jpeg";
                    img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                }
            }
            else
            {
                img = Image.FromFile(file_path + "\\no_image.jpg");
                context.Response.ContentType = "image/jpeg";
                img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
            }
        }
        else
        {
            img = Image.FromFile(file_path + "\\no_image.jpg");
            context.Response.ContentType = "image/jpeg";
            img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
        img.Dispose();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    private ImageFormat get_format(string ftype)
    {
        switch (ftype)
        {
            case "jpeg":
                return ImageFormat.Jpeg;
            case "png":
                return ImageFormat.Png;
            case "gif":
                return ImageFormat.Gif;
            default:
                return ImageFormat.Jpeg;
        }
    }
}

Я использую Linq для извлечения местоположения и ввода из базы данных на основе идентификатора пользователя, затем я возвращаю изображение на запрашивающую страницу. Кажется, это работает нормально, но я включил его на случай, если могут возникнуть какие-либо проблемы, которые я упустил.

Вопрос

Мне нужно динамически классифицировать изображение на основе его размеров, я могу сделать это либо в .NET-коде, либо с помощью jQuery. Что я делаю не так с вышеуказанными методами, из-за чего они не работают правильно?


person jon3laze    schedule 10.01.2011    source источник


Ответы (1)


Событие .load может иметь проблемы, если изображение загружается из кеша браузера (см. http://api.jquery.com/load-event/) - возможно, вы могли бы попробовать либо отключить кеширование, либо добавить значение времени к изображению, чтобы браузер не кэшировал его, на случай, если возникнет эта проблема?

person Mad Halfling    schedule 11.01.2011
comment
Я написал функцию для предотвращения кеширования, но забыл обернуть в нее URL-адрес изображения. : P Спасибо - person jon3laze; 12.01.2011