跳到主内容
搜索

lickies' life

搜索
  

lickies' life > 类别
如何编写远程登陆MOSS的代码
有些时候我们可能需要通过其他种方式设置远程登陆到MOSS.
 
下面录制了一个3分钟视频来教一下大家.
 
关于表单认证的权限问题解决
 

近期看到CSDN上有人在 问表单认证没有权限.不知道如何处理.

 

下面简要描述一下解决的办法.

 

从原理上来说,通过新增端口,AD认证可以和表单认证实现双认证.

但是从权限上来说的话,AD的用户默认在表单认证是没有权限的.

 

首先我们来看一下AD认证下,我们是如何增加用户权限的

通过上图我们可以看到

他的帐户名为qzit\leijun,即域名\用户名

 

那我们再看一下表单认证下的权限增加

 

大家可以看到我们通过搜索可以搜索出两个账户

其中aspnetactivedirectorymembershipprovider:leijun就是表单认证下的账户了.

Aspnetactivedirectorymembershipprovider是表单认证设置的PROVIDER.

 

因此,要查看是否有表单认证的权限,那么必须查看在权限里是否有这个账户,而不是看域名\username这样的账户.

 

再下来,可能很多人都是通过程序来自动添加用户的MOSS上的权限的,那么应该修改成下面相应的代码

sp.Users.Add(@"aspnetactivedirectorymembershipprovider:" + 登陆名, email, 显示名, "");

 

利用代码给SPUSER字段增加用户。
大家都知道。我们的列表有一个很重要的类型就是用户类型。
当我们新增加一个字段为用户类型,例如用户组等。是一个多选的。

那么我们如何通过代码的方式给这个类型增加用户呢。
可以用以下的方式


using (SPSite site = new SPSite("http://site"))
{
using (SPWeb web = site.AllWebs["Web"])
    {
    SPList list = web.Lists["List"];
    SPListItem item = list.Items[0];
    SPFieldUserValueCollection values = (SPFieldUserValueCollection)item["Users"];
    SPUserCollection users = web.AllUsers;
    foreach (SPUser user in users)
    {
        values.Add(new SPFieldUserValue(web, user.ID, user.Name));
    }
    item["Users"] = values;
    item.Update();
    }
}


大家看明白了吗?


通过创建MOSS自定义字段类来实现和基于TREEVIEW的OU菜单
在网上一有一篇文章,来很仔细的描述如何增加自定义字段的.

以下是内容,我复制过来,大家可以先试试,然后再做基于TREEVIEW的OU组织结构菜单

--------------------------

MOSS2007的自定义字段类型是一个非常有用的功能,但在网上相关的实例介绍很少,所以下面就
一步一步地介绍怎样来创建一个自定义字段类型,我们的目标是:实现一个具有可配置性的下拉列表框,
其选择项目是读取XML文件获得。

实现一个自定义字段类型主要需要完成三种文件的编制:1)定义类型的XML文件;2)定义展现模板
*.ascx
文件;3)定义后台代码程序集。

这里因为我们想要实现一个可读取XML文件的下拉列表框,所以我们首先还要定义一个配置文件
SelectItemFromXMLConfig.xml

XML代码如下:

<?xml version="1.0" encoding="utf-8"?>
<SelectItems>
  
<Item>
选项一</Item>
  
<Item>选项二</Item>
  
<Item>选项三</Item>
  
<Item>选项四</Item>
  
<Item>选项五</Item>
</SelectItems>

然后,我们可以打开Visual Studio2005,然后添加一个类库,如果你已经安装了扩展模板也可以直接选择
创建“Field Control”类型的项目。建议下载微软的SharePoint工具包:Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions.

这里我们新建一个名叫SelectItemFromXMLField的类库,其中包含两个类文件:SelectItemFromXML.Field.cs
SelectItemFromXML.FieldControl.cs

SelectItemFromXML.Field.cs完整代码如下:

using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;

namespace SelectItemFromXML
{
    [CLSCompliant(
false)]
    [Guid("92f76873-537c-4c13-abaf-2d47bdc7e2be")]
    
public class SelectItemFromXMLField : SPFieldChoice
    
{
        
public SelectItemFromXMLField(SPFieldCollection fields, string fieldName)
            : 
base(fields, fieldName)
        
{
        }
        
        
public SelectItemFromXMLField(SPFieldCollection fields, string typeName, string displayName)
            : 
base(fields, typeName, displayName)
        
{
        }

        
public override BaseFieldControl FieldRenderingControl
        
{
            [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = 
true)]
            
get
            
{
                BaseFieldControl fieldControl = 
new SelectItemFromXMLFieldControl();
                fieldControl.FieldName = 
this.InternalName;

                
return fieldControl;
            }
        }
    }
}

SelectItemFromXML.FieldControl.cs完整代码如下:

using System;
using System.Runtime.InteropServices;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls;
using System.IO;
using System.Xml;
using System.Diagnostics;

namespace SelectItemFromXML
{
    [CLSCompliant(
false)]
    [Guid("eb269bd9-0d3e-4aa2-b88f-37fbccb0d7d8")]
    
public class SelectItemFromXMLFieldControl : BaseFieldControl
    
{
        
protected DropDownList cboList;
        
protected override string DefaultTemplateName
        
{
            
get
            
{
                
return "SelectItemFromXMLFieldControl";
            }
        }

        
public override object Value
        
{
            
get
            
{
                EnsureChildControls();
                
return cboList.SelectedValue.ToString();
            }
            
set
            
{
                EnsureChildControls();
                cboList.SelectedValue = (
string)this.ItemFieldValue;
            }
        }

        
public override void Focus()
        
{
            EnsureChildControls();
            cboList.Focus();
        }

        
protected override void CreateChildControls()
        
{
            
if (Field == nullreturn;
            
base.CreateChildControls();

            
if (ControlMode == Microsoft.SharePoint.WebControls.SPControlMode.Display)
                
return;

            cboList = (DropDownList)TemplateContainer.FindControl("cboList");

            
if (cboList == null)
            
{
                
throw new ArgumentException("cboList is null. Corrupted SelectItemFromXMLFieldControl.ascx file.");
            }

            
if (!Page.IsPostBack)
            
{
                    
                    
string configFile = Environment.CurrentDirectory + "\\SelectItemFromXMLConfig.xml";
                    
if (!File.Exists(configFile))
                    
{
                        cboList.Items.Add(
new ListItem("Config file not found!","Error"));
                        cboList.ToolTip = configFile + " not found!";
                    }
                    
else
                    
{

                        XmlDocument xmlDoc = 
new XmlDocument();
                        xmlDoc.Load(configFile);

                        XmlNodeList nodelist = xmlDoc.DocumentElement.ChildNodes;
                        
foreach (XmlNode node in nodelist)
                        
{
                            cboList.Items.Add(
new ListItem(node.InnerText, node.InnerText));
                        }
                    }
         
            }
            
        }

    }
}

如果你使用模板创建项目,则上面的代码大部分会被自动生成。

值得注意的几个地方是:
 1)SelectItemFromXMLField类将继承SPFieldChoice基类,并重写FieldRenderingControl方法。
 2)SelectItemFromXMLFieldControl 类将继承BaseFieldControl基类。
 3)CreateChildControls方法中读取XML配置文件,并把选项绑定到下拉列表框(DropDownList)子控件上。
 4)上面代码中使用了Environment.CurrentDirectory语句,后面部署时要把配置文件放到

代码编写完成之后,要对程序集进行强名称设置,并编译。

接下来,我们来制作展现模板。你可以在当前解决方案中添加一个文本文件“SelectItemFromXMLFieldControl.ascx”
然后打该文件编写代码如下:

<% @ Control Language="C#" Debug="true"%>
<%
@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 

PublicKeyToken=71e9bce111e9429c" %>
<%
@ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, 

PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls"  %>

<SharePoint:RenderingTemplate ID="SelectItemFromXMLFieldControl" runat="server">
    
<Template>
        
<asp:DropDownList runat="server" ID="cboList"/>
    
</Template>
</SharePoint:RenderingTemplate>

值得注意的地方是:上面代码中DropDownList的ID是"cboList",这个名字曾经被后台类SelectItemFromXMLFieldControl使用
TemplateContainer.FindControl
方法寻找过,所以不要写错。

OK,最后,我们可以在当前解决方案中添加一个XML文件“FLDTYPES_SelectItemFromXmlField.xml”
代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FieldTypes>
  
<FieldType>
    
<Field Name="TypeName">SelectItemFromXML</Field>
    
<Field Name="ParentType">Choice</Field>
    
<Field Name="TypeDisplayName">Select Item From XML</Field>
    
<Field Name="TypeShortDescription">Select Item From XML</Field>
    
<Field Name="UserCreatable">TRUE</Field>
    
<Field Name="ShowInListCreate">TRUE</Field>
    
<Field Name="ShowInSurveyCreate">TRUE</Field>
    
<Field Name="ShowInDocumentLibraryCreate">TRUE</Field>
    
<Field Name="ShowInColumnTemplateCreate">TRUE</Field>
    
<Field Name="FieldTypeClass">SelectItemFromXML.SelectItemFromXMLField,SelectItemFromXMLField, 

Version=1.0.0.0, Culture=neutral, PublicKeyToken=ad167643f06d0c9c</Field>
  
</FieldType>
</FieldTypes>

值得注意的地方是:
  1)该定义文件的文件名一定要以“FLDTYPES”开头。
  2)FieldTypeClass项中的值是类的全名称和程序集的全名称,可以使用Reflector获得。


到这里,我们需要编写的所有文件都已经编写完成了,只要做简单的部署就可以了。

步骤如下:

  1)把强名称编译好的SelectItemFromXMLField程序集加入到GAC。
  2)把类型定义文件FLDTYPES_SelectItemFromXmlField.xml拷贝到c:\program...\12\TEMPLATE\XML目录下。
  3)把模板文件SelectItemFromXMLFieldControl.ascx拷贝到c:\program...\12\TEMPLATE\CONTROLTEMPLATES目录下。
   
4)重启动IIS。(可以使用命令行iisreset
  5)把该控件的配置文件SelectItemFromXMLConfig.xml拷贝到C:\Windows\System32\inetsrv目录下。
  
 
值得注意的地方是:
  前四步是部署自定义字段类型的一般步骤。第五步是针对这个实例的特殊步骤。你其实可以把配置文件放在你想放的任何位置,只要在前面编写SelectItemFromXMLFieldControl类的CreateChildControls方法时指定你想放的位置即可。

OK,到此自定义字段类型的过程已经结束。你可以在创建MOSS的某个列表栏时,发现一个新的类型“Select Item From XML”。选择该类型创建一个新栏后,当往该列表中添加项目时,会发现添加页面中对应新栏的输入方式是一个下拉列表框,其中的选项就是我们在XML配置文件中定义的选项了!



----------------------------------------
接下来,我来告诉大家如何做TREEVIEW的树型菜单.

首先修改.ASCX文件

<% @ Control Language="C#" Debug="true"%>
<% @ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<% @ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=12.0.0.0,

 Culture=neutral, PublicKeyToken=71e9bce111e9429c" Namespace="Microsoft.SharePoint.WebControls"  %>

<SharePoint:RenderingTemplate ID="SelectItemFromXMLFieldControl" runat="server">
    <Template>
   
        <asp:TextBox ID="txt_Ou" runat="server"></asp:TextBox>
     <asp:TreeView ID="TreeView1" runat="server" ShowLines="True">
</asp:TreeView>
    </Template>
</SharePoint:RenderingTemplate>
修改SelectItemFromXML.FieldControl.cs文件
using System;
using System.Runtime.InteropServices;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls;
using System.IO;
using System.Xml;
using System.Diagnostics;
using System.DirectoryServices;


namespace SelectItemFromXML
{
    [CLSCompliant(false)]
    [Guid("eb269bd9-0d3e-4aa2-b88f-37fbccb0d7d8")]
    public class SelectItemFromXMLFieldControl : BaseFieldControl
    {

        protected TreeView TreeView1;
        protected TextBox txt_Ou;
        protected override string DefaultTemplateName
        {
            get
            {
                return "SelectItemFromXMLFieldControl";
            }
        }

        public override object Value
        {
            get
            {
                EnsureChildControls();
                return txt_Ou.Text;
            }
            set
            {
                EnsureChildControls();
                txt_Ou.Text = (string)this.ItemFieldValue;
            }
        }

        public override void Focus()
        {
            EnsureChildControls();
            txt_Ou.Focus();
        }

        protected override void CreateChildControls()
        {
            if (Field == null) return;
            base.CreateChildControls();

            if (ControlMode == Microsoft.SharePoint.WebControls.SPControlMode.Display)
                return;

            txt_Ou = (TextBox)TemplateContainer.FindControl("txt_Ou");
            TreeView1 = (TreeView)TemplateContainer.FindControl("TreeView1");
          
            if (!Page.IsPostBack)
            {             
               
                TreeNode node2 = new TreeNode();
                node2.Text = "泉州移动";
                TreeView1.Nodes.Add(node2);
                GetOu("OU=泉州移动", 10,node2);
               
            }

        }
        protected void TreeView1_SelectNodeChanged(object sender, EventArgs e)
        {

        }
        public void GetOu(string ouname, int amstr,TreeNode nodetmp)
        {
            //获取AD的对象
            //搜索组织单位
            DirectoryEntry entry = new DirectoryEntry("LDAP://SHAREPOINT2007.QZIT.COM", "administrator", "你的密码");
            //获取子结点
            System.DirectoryServices.DirectoryEntry subentry = entry.Children.Find(ouname, "organizationalUnit");
           

            //对子对象进行循环
            foreach (DirectoryEntry res in subentry.Children)
            {
                if (res.Name.Substring(0, 3) == "OU=")//判断是否为OU
                {
                    //增加子结点
                    TreeNode node2 = new TreeNode();
                    node2.Text = res.Name.ToString().Replace("OU=", "") ;
                    nodetmp.ChildNodes.Add(node2);
                    //递归调用
                    GetOu(res.Name.ToString()+","+ouname, 10,node2);
                  
                }
            }

        }
    }
}
其中必须确定在AD根结点下建立一个泉州移动的组织单位(也可修改其中代码)

基于AD的用户组织目录树选择工具的解决方案
默认情况下,MOSS具有的用户选择器非常不方便,我们的领导希望用组织目录树的方式来进行人员的选择,当然,这可难倒我了。最后我选择了自定义字段来进行开发,解决这样的问题。不知道是否也有人和我碰到同样的问题呢。

那么,首先我们来看moss默认的用户选择器

这个界面很适合老外的简单操作的风格,但是对于有中国特色的组织那就没有办法了。
那么,我们通过开发一个自定义字段来解决这样的一些问题。
首先我们把编写好的自定义字段安装上去,该步骤省略,等我的整体解决方案公布后会提供安装的方法,现在由于只是DEMO,就没有直接放代码了。
我们可以看到下图
2

已经有了用来调用组织单位的目录树的自定义字段了。

设置标题为选择人员,点击确定得到下图
3
从这个图中我们可以看出这个自定义字段有两个控件,一个是文本框,用来存储你选择的用户,另外一个是连接,由于用户选择器一般都比较大,我选择新弹出窗口来实现,而不直接写到自定义字段内,新弹出的窗口是一个标准的ASPX的文件,我们可以把它部署在_LAYOUTS目录地下。
下面我们点击选择,就会跳出下面的窗口
4

从这张图中你就可以看出大概的样子了。

左边这个是用TREEVIEW递归读取的AD的组织结构
当我们点击某个部门的时候,他将列举出该部门下的所有人员,如下图


细心的同学可以发现在中间的框里有一个包含下级的选择框,当我们打勾后将出现该部门的下属部门的所有人员,方便管理人员选择他的直接下级。
在人员列出后,我们打勾进行人员选择,点旁边的>>号即可将这些人员提交到第三栏,当前选择人员中。如下图
7
点击确定后,我们将回到MOSS界面,同时也会将值传递到刚才那个文本框里,如下图(注意:这里我们存储的是中文的名称,但是这并不妨碍我们实际存储的值为LOGinNAME。)
8

最后我们将该记录保存,在查看视图中可以发现,我们的记录事实上是以登录的帐号来进行保存的,以确定唯一性,如下图

9

好了。演示完毕,
目前只是demo,接下来还要做的是整理成WSP包,以及存储成user字段,参数设置等调整,请大家耐心等待。如果有什么问题,请到我的BLOG进行留言。
 
整个项目文件在此下载
 
 
目录树的.net程序在此下载
 
利用SharePoint Designer更改任务列表状态栏显示
有时候为了更直观地察看任务列表的状态显示,我们希望把文字转化为图标的形式展现。

moss 默认的任务列表状态显示是文字的:
    

现在我们可以利用SPD快速将状态显示转化为如下效果(鼠标停留时文字提示)
    

Steps:
1.       SPD打开需要编辑的任务列表视图

2.       右健选择-〉“转化为XSLT数据视图”

3.       选中”Status”列,切换到代码视图,并添加如下代码

<TD Class="{$IDAFG5TH}">            
 
<xsl:choose>
  
<xsl:when test="@Status = 'Completed'">
  
<img src="/pic/KPIDefault-0.gif" alt="Completed"/>
  
</xsl:when>
  
<xsl:when test="@Status = 'Not Started'">
  
<img src="/pic/KPIDefault-2.gif" alt="Not Started"/>
  
</xsl:when>
 
</xsl:choose>
</TD>

Ps:这里只是列举了俩个枚举值'Completed''Not Started'

4.       最后保存就这样就完成了,很简单吧J

[XSLT专题]一。在MOSS中如何限制标题在首页上显示的长度?
在MOSS相关的项目中,我们经常要将内容聚合到首页:比方说新闻、通知、文档等内容,由于首页内容相对较多,因此要对各部分内容显示的区域加以限制,才能保证整个页面布局的和谐与统一,限制标题显示的字符数,就成了一个必须的要求。MOSS的文档库和列表本身的试图并不提供本身的功能,所以要实现这样的功能就必须自己动手,一是写自己的webpart,取出库和列表的内容,然后按照自己的要求去展示内容,这种方法的优点是通用性强,并且可以将webpart写的更加通用些,一次投入就一直受益,适合有开发能力的公司或个人;这种方法在SPS2003下就有人做了相应的工作。
      那么,对于像我这样的专注于系统而没有开发经验的人来说,是不是就没有办法了呢?答案当然是否定的!在Sharepoint designer中,有一项神奇的功能,可以将MOSS的库和列表转换成XSLT数据视图,借助于XSLT,我们可以灵活的控制内容展示的形式。
      比如,我们想对这个列表的标题的字数加以限制,当字数<=12时,则显示全部的标题,如果字数>12,则截取前面的9个字,并在后面加上...
      在SPD中找到我们插入页面的库或列表,右键,选择转换成XSLT试图。
      对于列表,选择列表的标题,对应的XSL代码为:
        <xsl:value-of disable-output-escaping="no" select="@Title" />
      将代码替换为:
      <xsl:if test="string-length(@Title)<=12">    判断如果标题的字符串长度是否<=12
              <xsl:value-of disable-output-escaping="no" select="@Title" />    显示完整标题:select="@Title"
      </xsl:if>
      <xsl:if test="string-length(@Title)>12">    判断如果标题的字符串长度是否>12
              <xsl:value-of select="substring(string(@Title),1,9)" />...        显示标题的前9个字符,并在后面加上 ...
      </xsl:if>
      对于文档库,select的值不是标题,而是将文件名处理后的标题,代码如下:
      <xsl:value-of select="ddwrt:UrlBaseName(string(@LinkFilename))" />
      我们需要将对应的代码修改如下:
        <xsl:if test="string-length(@LinkFilename)<=12">
              <xsl:value-of select="ddwrt:UrlBaseName(string(@LinkFilename))" />
        </xsl:if>
        <xsl:if test="string-length(@LinkFilename)>12">
              <xsl:value-of select="substring(ddwrt:UrlBaseName(string(@LinkFilename)),1,9)" />...
        </xsl:if>

      美中不足的是,我发现代码中对于字符串的计数是不分全角半角的,统统按照一个计算,这样的话,如果标题或文件名中如果包含了半角的字母或数字,所显示的结果就不会如我们的想象一样,是一个固定的长度,不过,对于标题过长从而换行导致的布局问题,总算是解决了!
      注:文中标题部分的代码,参考了西安huahua同学在MOSS群中的讨论,才使得我对这个问题有了一个完整的认识,在此表示感谢!
MOSS网站开发指北
说是指南,有点过了,只是想让初学者或者没有做过MOSS整体项目的人一些整体的了解。

如何利用Sharepoint开发一个完全不同与Sharepoint风格的站点其实和普通的.NET站点是完全不一样的,首先必须熟悉MOSS的很多功能,例如WEBPART,EVENTHANDLER,内容类型,CUSTOMER FIELD等,其实提供的是一个整体的解决方案,根据不同的需求来规划设计出不同的方案,因此经验和规划能力更重要。


步骤一:定义基本的网站地图和设计
就像许多Web项目一样,基本的站点地图和设计告诉开发团队基本的功能需求。站点地图能够使我们知道在站点上的各种不同类型的页面,设计使我们知道需要使用什么样的Feature.两者会随着进程不断的变化,但是他们给我们提供了项目开始的基线。
步骤二:定义自己的Content Columns 和Content Types
Content Types 是SharePoint的巨大特色,它为整个站点提供了底层结构。在项目的初期花费时间定义页面布局和Lists所需要的Content types是值得的。不需要定义的特别彻底,但是在开始时在这方面做的工作越多,以后返工的工作就少。
可以在项目中创建若干个Content Type组。例如”HedKandi Page Layout Content Types”和”HedKandi Custom List Content Types”.这主要考虑到当最终用户创建views时有更好的用户体验,同时也可以容易区分哪一个是开箱即用的content types,哪一个是我们创建的。
步骤3:定义自定义Lists
Lists是项目的骨架,可以创建若干个Site Collection级别的Lists以保证一致性和内容的复用。
步骤4:创建基本的站点层次结构
如果站点的层次结构不复杂,那就在Site Action用户界面下创建层次结构。如果是一个相当大的站点,那就应该提前创建整个站点的层次结构,建议使用 Stsadm –o createsite 命令或写一个简单的应用程序通过API自动创建层次结构。
步骤5 加入图像和CSS文件

一旦拥有了基本的站点架构,Custom content types和Lists,就可以开始把站点建造成设计的样子。这是我们第一次使用SharePoint Designer的时候,利用SPD可以非常容易地加入Css文件。至于Content Types如果想确保我们知道哪一些是开箱即用的,哪一些是我们在工程期间加入的,可以在Style Library List中加入新的目录例如叫做HedKandi,在这个目录下分别创建CSS和Images目录,我们把图像和CSS文件分别放到这些目录中。
步骤6 建立自己的Master Pages
因为工程中有许多布局大不相同页面,而且它们位于站点的不同位置,所以选择使用多个Master Pages。由于已经对XHMTL文件做了大量的工作,所以我们可以快速的创建新的Master Pages.因为我们想要利用站点中现有页面布局,所以我们对 控件保持同样的命名规则。
步骤7 创建自己的页面布局
这时我们可以真正看到预定义好的Page Layout Content Types以及XHTML的益处。当做了这些工作后创建一个平面的页面布局是相当快速的,主要是由于SPD的工具箱和SharePoint的高度集成。把content field加入到页面中,只要把它从工具箱中选中,拖拽到页面上就行了,不论是在设计模式还是代码模式下。如果已经很好定义了Content Type并且进行了适当的描述,这样开发人员就不必总是通过参考文档才知道field control是做什么的,这些controls应该是什么格式的,这将在工程中大大节省时间。
  这时,我们就拥有了一个可以工作的站点,看起来非常接近设计的样子,可以让作者开始向Lists输入内容,创建基于Page Layouts的页面。这就勾勒出了测试过程,因为这意味着我们能够捕捉到丢失的Fields或功能。
步骤8 定制自己的Content Query webpart 视图
Content Query wb part是在网站中最常用的webpart之一。我们在各处使用它们从Lists中集合内容数据。我们发现为了满足设计上的需要,可以快速的变化web part提供的一套标准的视图。我们可以创建定制的XSLT模版以满足需求,通过修改itemstyle.xsl文件――位于站点集合根目录下的/Style Library/XSL Style Sheets
通过给itemstyle.xsl文件增加一个新的XSLT模版就自动的把其中的内容增加到Web part属性的下拉列表中。这非常省时,但是要注意文件中语法错误会导致在Site Collection中的所有的Content Query webparts实例崩溃。
MOSS项目需要注意的几大问题
1.客户满意
带给客户期望的好处和业务,需要和客户详细沟通,不允许直接从功能需求上考虑实现,设置正确的客户期望值
2.稳定
网站开发完后希望有稳定的运行,更多的是服务器设置的一些问题,性能等,
3.安全
这个也是MOSS比较头疼的问题,MOSS本身已经有很强大的权限管理,但是也需要一定的管理,例如网站的权限,列表的权限,记录的自定义权限等,权限是否需要继承等诸多问题,访问群体,这些权限的设置应该如何设置,是需要很多经验积累的,例如有很多人通过视图不显示这些数据,但是事实上,这些数据是可以通过URL地址等各类方式来显示的。必须从根本上来限制他的安全级别。
4.扩展
为明天去做设计,让用户长期使用,很有感悟,曾经看到群里一个网友发布他的MOSS站点的设计,事实上他做的不错,MOSS已经被他改的面目全非了。界面也很漂亮,但是我们会发现,他所有的WEBPART都是写死得。想随便拖拉一下都不可以,那这样还不如写个.NET程序。用MOSS就是希望尽量的挖掘他的功能,减少开发量和维护量,而这个东西扩展的性能就非常重要。
5.灵活
MOSS有feature,customer field,masterpage,这些.NET2.0的特性,便于日后的升级是非常有好处的。因为至少.NET3.5的内核和.ET3.0没有太大的核心的变化。
如果有问题的话可以在留言板里提问,然后留下你的EMAIL方式,我会将解答发送到你的EMAIL。
AD认证模式下如何通过表单登录来代替WINDOWS弹出窗口的方法

由于图片放在MSOTEC网站上,建议大家由下面的地址查看.

http://www.msotec.com/showtopic-1454.aspx

 

MOSS用那么久了,有人采用AD认证,有人采用FORM认证,我们公司是采用中间的替换方法,因为采用FORM认证个人觉得还是不是太方便,例如需要开两个端口等。个人有个做法把经验共享给大家,如果做得不对或者有更好的办法的话,可以联系我。

 

1.原因

为什么要进行表单登录,默认MOSS采用AD认证,是因为用户默认存储为AD,如果有人要把用户和以前的系统进行结合的方式,那么请采用正规的FORM认证进行开发。

我今天要讲的是AD认证,AD认证有个不好的方式就是弹出对话框,界面不友好,例如我要在界面上放一个忘记密码的方式是完全做不到的。

 

现在教大家一种采用表单进行提交的简单方法。其实这个办法很早的时候十一就搞过,不复杂,我只是稍微完善了一下。

 

1.首先采用匿名访问。

  1.1IIS开启匿名访问。

  1.2验证提供程序需要开启。操作方式:管理中心--》应用程序管理--》应用程序安全性--》验证提供程序--》默认

 

  1.3开启网站匿名访问。操作为:网站操作--》高级权限--》设置--》匿名访问,如下

2.设置登录界面

我们需要开发一个登录界面。输入用户。密码。

这个登录界面可以放在_LAYOUTS/目录底下。

登录界面代码请见附件。

需要改几个地址如下:

../../sharepoint/test/default.aspx 这个界面是需要验证的界面(默认网站已经开了匿名,只需要验证到其他一个非匿名访问的地址即可)

http://10.49.28.7  这个是我们要返回的界面

如果还不清楚的。可以访问http://keji.lickies.cn 查看。

 

3.登录后自动跳转到登录界面的方式,因为我们已经开放了匿名,默认我们是可以进去的,那么我们需要增加一段程序,判断如果AD用户为空的话则跳转到登录界面。

我们采用一个办法是在MASTERPAGE里增加一个USERCONTROL

 

如何做呢?打开默认的在12/TEMPLATE/GLOBRAL/DEFAULT.MASTER(如果有改过则到SPD里找)

<%@ Register TagPrefix="wssuc" TagName="Welcome" src="~/_controltemplates/Welcome.ascx" %>

下增加
<%@ Register TagPrefix="wssuc" TagName="login" Src="~/_controltemplates/chklogin9.ascx" %>

 

在<BODY scroll="yes" onload="javascript:if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper();">

下增加

<wssuc:login id="chklogin" runat="server" EnableViewState="false"></wssuc:login>

可能很多人在问CHKLOGIN.ascx是啥。

就是我们的用户控件,,,这个文件如下。附件可以下载。。

 

<%@ Control Language="C#" Inherits="Microsoft.SharePoint.ApplicationPages.WebControls.ActionBar,Microsoft.

SharePoint,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"    compilationMode="Always" %>
<%@ Register Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral,

PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%

if(HttpContext.Current.User.Identity.Name.ToString()=="")
{
    Response.Redirect("/_layouts/web/login.aspx");
}

%>

请把这个文件放到c:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES下即可。

大概写了一下。有问题的话,大家QQ群联系。

1 - 10 下一步