以编程方式创建了一个列表视图,用于显示图像。当您单击下载时,会触发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 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和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,但未在此控件中使用。
答案 0 :(得分:0)
您遇到的是SharePoint试图变得聪明。 当一个网站运行缓慢(即使在运行SharePoint时也会发生这种情况),用户倾向于多次按下按钮/链接,这不会使事情变得更快,并且可能会因事件被触发两次而导致麻烦。因此,SharePoint默认禁用多个回发。
几乎所有关于将AJAX与SharePoint一起使用的文章都可以找到对此的修复。查找您应该实现的EnsurePanelFix函数,并在显示列表视图的代码中调用。
答案 1 :(得分:0)
问题与listview甚至SharePoint(一次性)无关。 我正在使用itemCommand方法,这是一个回发,因此在处理回发时,我的代码突然劫持HTTP响应,然后将输出更改为图像类型并添加附件标头。这意味着asp.net不再像往常那样处理流。 解: 我将下载链接作为标准锚标记,指向解决该问题的httpHandler。