Возврат заголовка ответа ASP.NET - PullRequest
1 голос
/ 21 июня 2010

Программно создан просмотр списка для отображения изображений.Когда вы нажимаете на загрузку, запускается ItemCommand, и браузер отправляет пользователю изображение в виде двоичного ответа, используя следующее:

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, это объявление ListView в методе 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");

И это ItemTemplate и 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();
   }

Я более чем немного озадачен здесь.AJAX включен на сайте, но не используется в этом элементе управления.

Ответы [ 2 ]

0 голосов
/ 05 июля 2010

Проблема была не в том, чтобы иметь вид списка или даже в SharePoint (на этот раз).Я использовал метод itemCommand, который представляет собой обратную передачу, поэтому при обработке обратной передачи мой код внезапно перехватывает ответ HTTP, затем изменяет вывод на тип изображения и добавляет заголовок вложения.Это означает, что asp.net больше не может обрабатывать поток, как обычно.Решение: я сделал ссылку на скачивание стандартным тегом привязки, указывающим на httpHandler, который решает эту проблему.

0 голосов
/ 22 июня 2010

То, с чем вы сталкиваетесь, это то, что SharePoint пытается быть умным. Когда веб-сайт работает медленно (и это может происходить даже при работе SharePoint), пользователи, как правило, нажимают кнопки / ссылки несколько раз, что не приведет к ускорению и может вызвать проблемы, поскольку события запускаются дважды. Так что SharePoint по умолчанию отключает несколько обратных передач.

Исправление для этого можно найти практически в любой статье об использовании AJAX с SharePoint. Найдите функцию EnsurePanelFix, которую вы должны реализовать, и вызовите код, показывающий представление списка.

...