2010-06-21 27 views
1

Une liste a été créée par programmation pour l'affichage des images. Lorsque vous cliquez sur le téléchargement du ItemCommand est tiré, et le navigateur envoie à l'utilisateur l'image comme une réponse binaire, en utilisant les éléments suivants:Rétablissement de l'en-tête de réponse ASP.NET

SPFile ImageIfile = spfolder.Files[ServerName]; 
byte[] bs = ImageIfile.OpenBinary(); 
string res = Page.Response.ContentType; 
Page.Response.ContentType = "image/jpeg"; 
Page.Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(fileName)) 
Page.Response.BinaryWrite(bs); 
Page.Response.End(); 

Cela fonctionne exactement une fois. Ensuite, ni le lien de téléchargement, ni les contrôles de pagination DataPage ne fonctionnent jusqu'à ce que vous actualisiez (en effet toutes les publications).

EDIT: Il est un SharePoint 2007 webpart, voici la déclaration du ListView dans la méthode CreateChildControls:

lv.ItemPlaceholderID = "itemPlaceholder"; 
lv.GroupPlaceholderID = "groupPlaceholder"; 
lv.ID = "MediaSearch"; 
lv.LayoutTemplate = new LayoutTemplate(); 
lv.GroupTemplate = new GroupTemplate(); 
lv.GroupItemCount = 4; 
lv.ItemTemplate = new ItemTemplate(); 
lv.EmptyDataTemplate = this.Page.LoadTemplate("/usercontrols/MediaResults_Empty.ascx"); 

Et c'est le ItemTemplate et DataBinding

public class ItemTemplate : ITemplate 
{ 
    public void InstantiateIn(Control container) 
    { 
     //Top bit 
     Panel ItemPanel = new Panel(); 
     ItemPanel.ID = "itemPlaceholder"; 
     ItemPanel.Attributes["class"] = "mlitem"; 
     var thumbdiv = new HtmlGenericControl("div"); 
     thumbdiv.Attributes["class"] = "thumb-image"; 
     HyperLink aspLink = new HyperLink(); 
     aspLink.ID = "hlPicPreview"; 
     aspLink.Attributes["class"]="picture-preview"; 
     Image aspImg = new Image(); 
     aspImg.ID = "thumb"; 

     aspLink.Controls.Add(aspImg); 
     thumbdiv.Controls.Add(aspLink); 
     ItemPanel.Controls.Add(thumbdiv); 

     //Bottom bit 
     var bDiv = new HtmlGenericControl("div"); 
     bDiv.Attributes["class"] = "details"; 
     var UnOrderedList = new HtmlGenericControl("ul"); 
     var li1 = new HtmlGenericControl("li"); 
     Literal lit = new Literal(); 
     lit.ID = "liSize"; 
     lit.Text = "Size"; 
     li1.Controls.Add(lit); 
     var li2 = new HtmlGenericControl("li"); 
     LinkButton down = new LinkButton(); 
     down.ID = "lbDownload"; 
     down.CommandArgument = "Pugs"; 
     down.CommandName = "Download"; 
     down.Text = "Download"; 
     li2.Controls.Add(down); 
     UnOrderedList.Controls.Add(li1); 
     UnOrderedList.Controls.Add(li2); 
     bDiv.Controls.Add(UnOrderedList); 

     ItemPanel.Controls.Add(bDiv); 
     ItemPanel.DataBinding += new EventHandler(ItemPanel_DataBinding); 
     container.Controls.Add(ItemPanel); 
    } 

    void ItemPanel_DataBinding(object sender, EventArgs e) 
    { 
     Panel ThePanel = (Panel)sender; 
     //Get bindables 
     Image thumb = ThePanel.FindControl("thumb") as Image; 
     LinkButton lbdown = ThePanel.FindControl("lbDownload") as LinkButton; 
     ListViewDataItem lvdi = (ListViewDataItem)ThePanel.NamingContainer; 

     //Bind that stuff. 
     lbdown.CommandArgument = ((DataRowView)lvdi.DataItem)["URL"].ToString(); 
     thumb.ImageUrl = "~/" + ((DataRowView)lvdi.DataItem)["ThumbsNailsImg"].ToString(); 
    } 

je plus un peu perplexe ici. AJAX est activé sur le site, mais n'est pas utilisé dans ce contrôle.

+0

Je pense que cela a quelque chose à voir avec viewstate/gestion d'état, juste une supposition. Pouvez-vous poster le code qui construit le listview? – Peter

Répondre

0

Ce que vous utilisez est SharePoint essayant d'être intelligent. Lorsqu'un site Web ralentit (et cela peut arriver même lors de l'exécution de SharePoint), les utilisateurs ont tendance à appuyer plusieurs fois sur les boutons/liens, ce qui ne va pas accélérer les choses et causer des problèmes. Par conséquent, SharePoint désactive par défaut plusieurs publications. Le correctif pour cela peut être trouvé dans presque n'importe quel article sur l'utilisation d'AJAX avec SharePoint. Recherchez la fonction EnsurePanelFix que vous devez implémenter et appelez dans le code affichant la liste.

+0

Merci, mais mon contrôle n'utilise pas de panneau de mise à jour, et EnsurePanelFix n'a rien fait d'autre que de faire disparaître ma boîte Telerik Dropdown! Je vais modifier ma question pour montrer plus de la structure du contrôle. – user370975

0

Le problème n'avait rien à voir avec le listview ou même SharePoint (pour une fois). J'utilisais la méthode itemCommand, qui est une publication. Ainsi, lorsque la publication est en cours de traitement, mon code détourne soudainement la réponse HTTP, puis modifie la sortie en type d'image et ajoute un en-tête de pièce jointe. Cela signifie que asp.net ne peut plus traiter le flux comme d'habitude. solution: J'ai fait le lien de téléchargement d'une balise d'ancrage standard, pointant vers un httpHandler qui résout ce problème.