У меня есть обработчик ASHX, возвращающий изображение на загрузку страницы. Мне нужно добавить класс к изображению динамически в зависимости от размеров изображения. Я пытался сделать это с помощью следующих методов:ashx control return image, jquery get size on load или .NET OnLoad методы не работают
Код За методом
сСт
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" />
Это работает на начальной загрузки, однако на любых обратных передачах (загрузка нового i маг/вращение/обрезка), он не может правильно применить класс.
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 тянуть расположение и тип из базы данных на основе пользователей ID, я затем вернуть изображение на странице запроса. Кажется, это работает нормально, но я включил его в случае, если могут быть какие-то проблемы, которые я забыл.
Вопрос
мне нужно динамически классифицировать изображения, основываясь на его размеры, я могу сделать это либо в коде .NET позади или с JQuery. Что я делаю неправильно с вышеуказанными методами, которые заставляют его работать неправильно?
Я написал функцию для предотвращения кэширования, но забыл обернуть URL-адрес изображения в нем. : P Спасибо – jon3laze