使用 Data View Web Part 显示附件:第二部分






4.27/5 (6投票s)
使用对象模型通过数据视图 Web 部件显示附件。
引言
这是“使用数据视图 Web 部件显示附件”系列文章的第二部分。请先参阅第 1 部分。
SharePoint Designer 的数据视图 Web 部件是一个很棒的控件。我在自定义列表视图时经常使用它。我不喜欢它的一点是它缺少附件支持。使用数据视图,您只能检测项目是否具有附件。您无法显示它们或获取有关它们的任何信息。
据我所知,Microsoft 不建议在枚举列表时使用任何递归,也许这就是您无法浏览项目的附件的原因。
我通过两种方式解决了这个问题:一种是使用Lists.asmx Web 服务,适用于经过身份验证的环境,另一种是使用自定义通用处理程序 (ASHX) 页面。
测试项目
在这里,您可以找到一个测试项目,其中包含一个 ASHX 文件,您稍后应该将其复制到 SharePoint 站点。
开始吧
我们需要一个带有 DataView
的 ASPX 页面。请重复第 1 部分中的步骤 2 到 6。
在此示例中,我们需要编写一些代码。因此,请打开您的 Visual Studio。在此示例中,我使用了 VS2005。创建一个新的网站项目。向该网站添加一个新项目。文件类型应为通用处理程序 ASHX 文件。我们将其命名为Attachments.ashx。
如果您只想看到它工作,请将此代码复制到您的 ASHX 文件中
<%@ WebHandler Language="C#" Class="Attachments" %>
using System;
using System.Web;
using Microsoft.SharePoint;
public class Attachments : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/javascript";
SPSite sourceSite = new SPSite(@"https:///");
//SPControl.GetContextSite(Context);
SPWeb sourceWeb = sourceSite.AllWebs["/"];
Guid newListGuid =
new Guid(context.Request.QueryString["list"].ToString());
SPList attList = sourceWeb.Lists[newListGuid];
SPQuery query = new SPQuery(attList.Views[0]);
string camlQuery = "<Where><Eq><FieldRef Name=\"ID\" />" +
"<Value Type=\"Number\">";
camlQuery += context.Request.QueryString["ID"].ToString();
camlQuery += "</Value></Eq></Where>";
query.Query = camlQuery;
SPListItemCollection filteredEmployees = attList.GetItems(query);
context.Response.Write("str='");
foreach (SPListItem i in filteredEmployees)
{
for (int j = 0; j < i.Attachments.Count;j++ )
{
string att=i.Attachments[j].ToString();
string ret = "";
int found = 0;
found = att.LastIndexOf(".");
string ext = att.Substring(found+1);
switch (ext){
case "jpg":
case "png":
case "gif":
case "jpeg":
ret = "<img src=\"" + sourceSite.Url;
ret += attList.ParentWebUrl;
ret += "/Lists/" + attList.Title+"/Attachments/" ;
ret += context.Request.QueryString["ID"].ToString();
ret+="/" + att + "\" />";
break;
default:
ret = "<a href=\"" +
sourceSite.Url + attList.ParentWebUrl;
ret+="/Lists/" + attList.Title +
"/Attachments/";
ret+= context.Request.QueryString["ID"].ToString();
ret+="/" + att + "\">"+
sourceSite.Url + attList.ParentWebUrl;
ret+= "/Lists/" + attList.Title + "/Attachments/";
ret += context.Request.QueryString["ID"].ToString();
ret += "/" + att + "</a>";
break;
}
context.Response.Write( ret + "<br />");
}
}
context.Response.Write("';");
if(sourceWeb!=null)sourceWeb.Dispose();
//Comment this line if you use SPControl.GetContextSite
if(sourceSite != null) sourceSite.Dispose();
}
public bool IsReusable
{
get
{
return false;
}
}
}
不要忘记设置您的站点 URL 或取消注释 SPControl.GetContextSite(Context);
部分。我们的处理程序需要列表的 GUID 和项目 ID。我们需要 GUID 来识别列表,ID 来识别我们想要的项目。您也可以扩展它并将站点名称作为参数发送。我们的处理程序期望 GUID 和 ID 作为查询字符串发送。
我们使用对象模型来获取项目的附件,因此您需要引用Microsoft.Sharepoint.dll,它很可能位于C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI中。
在您测试了您的处理程序之后(例如,我只是将此代码添加到Default.aspx页面并运行该网站)。
测试代码
<script type="text/javascript">var str='';</script>
<script src="Attachments.ashx?ID=1&list={9990D322-09E1-46FF-807D-A4009BCEA5CB}"
type="text/javascript"></script>
<script type="text/javascript">
document.write(str);
alert(str);
</script>
您需要您的 ID 和 GUID(列表)的值。您可以通过转到 SharePoint 中的列表设置来查看列表的 GUID。请注意 IE 地址栏中的地址(例如,http://YourSite/_layouts/listedit.aspx?List=%7B89AE6AB1%2D117C%2D4FC1%2DB891%2DAB746592F1F5%7D)。这是 GUID:%7B89AE6AB1%2D117C%2D4FC1%2DB891%2DAB746592F1F5%7D。%7B是{符号,%2D 是 -,%7D 是 }。您也可以在 SharePoint Designer 中看到 GUID。当您将数据视图 Web 部件添加到您的页面时,只需转到 SharePoint:SPDataSource
标签并查找 ListID
元素。在您看到它工作之后,将您的 ASHX 文件 (Attachments.ashx) 复制到 SharePoint。我将其复制到我的 SharePoint Web 应用程序中的JavaScriptClient文件夹中。之后,只需将此代码复制到您的数据视图页面(与您在第一部分中复制代码的地方相同,在 <value-of disable-output-escaping="yes" select="@YourColumn" />
标签下面)
<xsl:if test="normalize-space(@Attachments) != '0'"><div>
<script type="text/javascript"><![CDATA[var str='';]]></script>
<script src="/JavaScriptClient/Attachments.ashx?ID={@ID}&list=YourGUID"
type="text/javascript"></script>
<script type="text/javascript"><![CDATA[document.write(str); ]]></script> </div>
</xsl:if>
就是这样!现在,您将看到带有列表项的附件。