2010-06-21 89 views
1

已經以編程方式創建了一個用於顯示圖像的列表視圖。當你點擊下載ItemCommand被激發,並在瀏覽器向用戶發送圖像作爲二元響應,使用以下:恢復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(); 

這工作,正好一次。然後,無論是下載鏈接,還是DataPage頁面控制器都不會工作,直到刷新(確實是任何回發)。

編輯:這是一個SharePoint 2007的WebPart,這是在CreateChildControls方法ListView控件的聲明:

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"); 

這是ItemTemplate模板和數據綁定

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

我多一點在這裏難倒了。 AJAX已在網站上啓用,但未在此控件中使用。

+0

我認爲這與視圖狀態/狀態管理有關,只是猜測。你能發佈構建listview的代碼嗎? – Peter 2010-06-21 16:45:15

回答

0

你正在運行的是SharePoint試圖變得聰明。 當網站速度慢時(即使運行SharePoint時也會發生這種情況),用戶往往會多次按下按鈕/鏈接,這不會讓事情變得更快,並且可能會因爲事件被激發兩次而造成麻煩。所以SharePoint默認禁用多個回發。

在幾乎所有關於在SharePoint中使用AJAX的文章中都可以找到該修復程序。查找您應該實現的EnsurePanelFix函數,並在顯示列表視圖的代碼中調用。

+0

謝謝,但我的控件不使用更新面板,並且EnsurePanelFix除了讓我的Telerik下拉框消失以外沒有做任何其他事情! 我將編輯我的問題以顯示更多控件的結構。 – user370975 2010-06-22 11:27:28

0

問題與listview甚至SharePoint(一次)無關。 我正在使用itemCommand方法,這是一個回發,所以當回發被處理時,我的代碼突然劫持HTTP響應,然後將輸出更改爲圖像類型並添加附件標題。這意味着asp.net不能像通常那樣處理流。 解決方案: 我使下載鏈接成爲標準錨標記,指向解決該問題的httpHandler。