在项目中,用户需求涉及在一个列表录入项目信息,选择一个项目后,与该项目相关的信息实现自动填写,这个需求在SharePoint列表里,我们只能通过重新定制SharePoint列表的新建、编辑页面来实现。
SharePoint的新建(NewForm.aspx)、编辑(EditForm.aspx)、查看(DispForm.aspx)页面都是存在数据库中,每个页面中都部署了一个SharePoint自己的ListFormWebPart,如下图:
![](https://images.cnblogs.com/cnblogs_com/nirvanalst/01.GIF)
上图是使用SharePointDesigner打开列表编辑页面的效果,由于在SharePoint网站中,列表的新建、编辑、查看页是没有“编辑页面”的选项,所以使用Designer来编辑页面,并可以向页面添加自己的WebPart用来实现数据的输入、保存等。
接下来开始定制新建页面:
1、 首先使用designer打开列表的NewForm.aspx页面,如下图:
![](https://images.cnblogs.com/cnblogs_com/nirvanalst/02.GIF)
2、 接着插入一个自己定义的TemplateWebPart(此WebPart用来载入用户控件ascx页面),如下图:
![](https://images.cnblogs.com/cnblogs_com/nirvanalst/03.GIF)
接着配置TemplateWebPart的UserControl路径,例如:/_layouts/MyPages/NewPage.ascx
3、 现在再次打开列表的新建页面就可以看到下图的效果
![](https://images.cnblogs.com/cnblogs_com/nirvanalst/04.GIF)
4、 接下来要做的就是把SharePoint自己的新建页面给隐藏起来,使用我们自己定义的WebPart来进行数据的录入,这样新建页面就能自己说了算了。
隐藏SharePoint自己的ListFormWebPart有两种方式:
1) 在Designer中双击ListFormWebPart,选中其“布局”属性中的“隐藏”选项。
这种方法有个缺陷,就是无法使用SharePoint自己的“附加文件”来上传附件。应为虽然是将ListFormWebPart隐藏不显示,但实际它的代码在IE浏览时还是会存在网页中。这时候点击“附加文件”链接,它的脚本就会出现错误。如果你的新建页面不用上传附件的话,这种方式还是比较方便省事的。
2) 重新定义一个空的SharePoint:RenderingTemplate,打开12"template"controltemplates"DefaultTemplates.ascx文件,在文件最后加入如下代码:
1 <SharePoint:RenderingTemplate ID="CustomerListForm" runat="server">
2 <Template>
3 </Template>
4 </SharePoint:RenderingTemplate>
5
用Designer打开新建页面,切换到代码视图,编辑ListFormWebPart的TemplateName属性,将TemplateName的值设置成自定义的模板“CustomerListForm”如下图:
![](https://images.cnblogs.com/cnblogs_com/nirvanalst/05.GIF)
保存后,实际现在新建页面的ListFormWebPart就是个摆设了,里面没有任何内容,有人会觉得那就把它删了就行了,我开始也是这么想的直接删了,结果在列表点击“新建”链接时,页面弹出新建页面链接无效,无法进入新建页面了。所以只能采取所谓“隐藏”的方法来做了,如果有其他方法还请大家帮忙指出,小弟在此先谢过了:)。
最后自定义列表新建页面就跟做.net页面一样了,想怎么弄都行了。编辑、查看的页面基本和这个相同。
TemplateWebPart代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
TemplateWebPart
1
using System;
2
using System.Collections.Generic;
3
using System.Web;
4
using System.Web.UI;
5
using System.ComponentModel;
6
using System.Web.UI.HtmlControls;
7
using System.Web.UI.WebControls;
8
using System.Web.UI.WebControls.WebParts;
9
using Microsoft.SharePoint;
10
using Microsoft.SharePoint.WebControls;
11
using Microsoft.SharePoint.WebPartPages;
12
using System.Xml.Serialization;
13![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
namespace ITSCustomMgr.WebParts
15![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
16
[XmlRoot(Namespace = "ITSCustomMgr.WebParts")]
17
public class TemplateWebPart : System.Web.UI.WebControls.WebParts.WebPart
18![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
19
private const string defaultText = "";
20
private string _userControl;
21
private UserControl _control;
22
private LiteralControl _child;
23![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
[WebBrowsable, Category("用户控件包装器设置"),
25
DefaultValue(defaultText),
26
Personalizable(),
27
FriendlyName("用户控件路径"), Description("请输入用户控件路径 (.ascx)")]
28
public string UserControl
29![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
30![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return _userControl; }
31![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ _userControl = value; }
32
}
33![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
protected internal void LoadUserControl()
35![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
36
if (!string.IsNullOrEmpty(this._userControl))
37![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
38
this._control = (UserControl)Page.LoadControl(this._userControl);
39
this.Controls.Add(this._control);
40
}
41
else
42![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
43
this._child = new LiteralControl(string.Format("Web 部件未绑定用户控件。请设置用户控件的 URL。例如“~/_CONTROLTEMPLATES/Welcome.ascx”)", 1, 129, this.ID));
44
this.Controls.Add(this._child);
45
}
46
}
47![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
48
protected override void CreateChildControls()
49![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
50
base.CreateChildControls();
51
this.Controls.Clear();
52
try
53![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
54
LoadUserControl();
55
}
56
catch (System.Exception ex)
57![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
58
this._child = new LiteralControl(string.Format("<b>错误:</b> 不能载入 {0}<br /><b>详细信息:</b> {1}", _userControl, ex.Message));
59
this.Controls.Add(this._child);
60
}
61
}
62![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63
protected override void Render(HtmlTextWriter writer)
64![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
65
EnsureChildControls();
66
if (_control != null)
67![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
68
_control.RenderControl(writer);
69
}
70
else
71![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72
_child.RenderControl(writer);
73
}
74
}
75
}
76
}
基本上自定义SharePoint列表新建页面就先介绍到这,过几天再来补充如何在新建、编辑页面中使用SharePoint的AttachmentUpload来实现上传附件。