2011-01-10 12 views
2

Ich habe eine ASHX-Handler ein Bild beim Laden der Seite zurückgeben. Ich muss dem Bild dynamisch eine Klasse hinzufügen, abhängig von den Abmessungen des Bildes. Ich habe versucht, dies zu tun, die folgenden Methoden:ashx Kontrolle Bild zurück, jquery Größe beim Laden oder .NET OnLoad Methoden nicht funktioniert

-Code Behind-Methode

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" /> 

Diese auf Anfangslast arbeitet, jedoch auf Postbacks (Upload eines neuen i mage/rotieren/beschneiden) kann die Klasse nicht korrekt angewendet werden.

jQuery-Methode

js

$(window).load(function(){ 

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

}); 

Diese Methode überhaupt nicht funktioniert, hat das Bild keine Klasse zugeordnet. Ich bin mir nicht sicher, ob dies ein Timing-Problem mit der Ashx-Kontrolle oder was ist.

ASHX-Code

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; 
     } 
    } 
} 

ich Linq bin mit dem Standort und die Art aus der Datenbank auf der Benutzer-ID basiert ziehen, kehre ich dann das Bild an die anfragende Seite. Dies scheint gut zu funktionieren, aber ich habe es für den Fall eingeschlossen, dass es irgendwelche Probleme geben könnte, die ich übersehen habe.

Frage

Ich brauche das Bild dynamisch zu klassifizieren, basierend auf seinen Dimensionen, kann ich dies entweder in .NET-Code hinter oder mit jQuery. Was mache ich falsch mit den oben genannten Methoden, die dazu führen, dass es nicht richtig funktioniert?

Antwort

1

Das .load-Ereignis kann Probleme haben, wenn das Bild aus dem Browser-Cache geladen wird (siehe http://api.jquery.com/load-event/) - vielleicht könnten Sie versuchen, entweder das Caching zu deaktivieren Fall ist es das Problem, das trifft?

+0

Ich habe eine Funktion geschrieben, die das Zwischenspeichern verhindert, aber vergessen habe, die Bild-URL darin zu verpacken. : P Danke – jon3laze