2010-06-21 7 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

나는 viewstate/state management와 관련이 있다고 생각합니다. listview를 빌드하는 코드를 게시 할 수 있습니까? – Peter

답변

0

SharePoint가 영리 해 지려고 노력하고 있습니다. 웹 사이트의 속도가 느려지면 (SharePoint 실행 중에도 이런 일이 발생할 수 있음) 사용자는 단추/링크를 여러 번 눌러야하는 경향이 있습니다. 이렇게하면 작업 속도가 빨라지거나 이벤트가 두 번 발생하면 문제가 발생할 수 있습니다. 그래서 SharePoint는 기본적으로 여러 포스트 백을 비활성화합니다.

이 문제는 SharePoint와 함께 AJAX를 사용하는 방법에 대한 거의 모든 기사에서 찾을 수 있습니다. EnsurePanelFix 함수를 찾고 구현해야하며 listview를 보여주는 코드를 호출하십시오.

+0

감사하지만 내 컨트롤은 업데이트 패널을 사용하지 않고 EnsurePanelFix는 Telerik 드롭 다운 상자가 사라지는 것을 제외한 다른 작업을 수행하지 않았습니다! 더 많은 컨트롤 구조를 보여주기 위해 내 질문을 편집합니다. – user370975

0

문제는 listview 또는 SharePoint (한 번)와 관련이 없습니다.postback 인 itemCommand 메소드를 사용하고 있었기 때문에 포스트 백이 처리 될 때 코드가 갑자기 HTTP 응답을 납치 한 다음 출력을 이미지 유형으로 변경하고 첨부 헤더를 추가합니다. 이것은 asp.net이 더 이상 보통 스트림을 처리 할 수 ​​없다는 것을 의미합니다. 솔루션 : 다운로드 링크를 표준 ​​앵커 태그로 만들었습니다.이 태그는 해당 문제를 해결하는 httpHandler를 가리 킵니다.