65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (6投票s)

2008 年 12 月 24 日

CPOL

3分钟阅读

viewsIcon

46652

downloadIcon

195

使用对象模型通过数据视图 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=&apos;&apos;;]]></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>

就是这样!现在,您将看到带有列表项的附件。

Att8.jpg

© . All rights reserved.