在SharePoint的开发过程中,我们经常会遇到这样的场景:用户填写的资料需要进行分步进行,但是所有的数据信息都是存放在SharePoint 的一个大的List 中,这个时候我们用的最多的方法就是通过SharePoint的对象模型,对数据进行操作,来完成List信息的新增和更新。
这样的方法存在以下的一些问题:
缺点:
1. 重复性
A. 字段和控件的重新定义,不能使用SharePoint定义好的字段和控件
B. 数据的存储,需要通过对象模型进行开发来完成
2. 不稳定性
自己重新对数据的存储进行开发,添加了失败的风险
优点:
1. 灵活性
我们能更加方便、灵活的进行界面的设计
我在前期的SharePoint的开发过程中,经常使用此方法,虽然已经有点习惯通过此方法来对List的操作,但是心里总是用起来有点别扭,给我的感觉就是SharePoint的List的操作不应该是这样的,虽然能解决问题,但是肯定不是最好的。功夫不负有心人啦,终于让我想到一个更好的方法。
如果大家用过SharePoint中的SPGridView 或者是 DateTime 控件的时候,会发现SharePoint中还有一些其他的控件,如SharePoint:RichTextField,但是这些控件应该是怎么样用的呢?
这些控件将解决我上面所说的问题,通过SharePoint中自带的一个Field控件,将能完成我们一些重新开放的工作。我们看下面的代码:
- Title:
- <SharePoint:TextField ID="txtTitle" runat ="server" />
- 任务一:
- <SharePoint:RadioButtonChoiceField runat="server" ID="task" />
- 会议说明
- <SharePoint:RichTextField runat="server" ID="rM" />
- <SharePoint:UserField runat="server" ID="user"/>
- <SharePoint:SaveButton runat="server" id="savebutton1" />
这些都是SharePoint中的Field控件,他们都存在以下的属性:
ControlMode:说明当前的状态 New,Edit,Display,Invaild
FieldName:Field的name
ListId: List的Id
所以我们对一个List新增的操作的时候,这样做就Ok了:
- Title:
- <SharePoint:TextField ControlMode="" ID="txtTitle" runat ="server" FieldName="Title" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703”/>
- 任务一:
- <SharePoint:RadioButtonChoiceField ControlMode="new" FieldName="_x4f1a__x8bae__x5ba4_" runat="server" ID="ad" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” />
- 会议说明
- <SharePoint:RichTextField runat="server" ControlMode="New" CssClass="ms-rtelong" FieldName="_x4f1a__x8bae__x8bf4__x660e_" ID="rM" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703”/>
- <SharePoint:UserField ControlMode="New" runat="server" FieldName="_x9886__x5bfc_" ID="user" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” />
- <SharePoint:SaveButton runat="server" ControlMode="New" Text="afd" id="savebutton1" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” />
当然这个前提是已经存在一个List,存在Title,任务,会议说明,一个用户类型的字段,分别对应的ListId和 FieldName 如上面描述的。
这个方法是肯定不够好了,因为要去查看List对应的Guid和Field 的StaticName这个是一个很麻烦的事情。
我们只要通过一个初始化的方法就可以解决此问题:
- Title:
- <SharePoint:TextField ControlMode=" new " ID="txtTitle" runat ="server" FieldName="Title" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” OnInit="OnInit1"/>
- 任务一:
- <SharePoint:RadioButtonChoiceField ControlMode="new" FieldName="_x4f1a__x8bae__x5ba4_" runat="server" ID="ad" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” OnInit="OnInit1"/>
- 会议说明
- <SharePoint:RichTextField runat="server" ControlMode="New" CssClass="ms-rtelong" FieldName="_x4f1a__x8bae__x8bf4__x660e_" ID="rM" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” OnInit="OnInit1"/>
- <SharePoint:UserField ControlMode="New" runat="server" FieldName="_x9886__x5bfc_" ID="user" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” OnInit="OnInit1" />
- <SharePoint:SaveButton runat="server" ControlMode="New" Text="afd" id="savebutton1" ListId =” 898bf992-6360-4387-b2e3-d9a5dc696703” OnInit="OnInit1" />
初始化的方法
- protected void OnInit1(object sender, EventArgs e)
- {
- SPSite site = new SPSite("http://pc-moss");
- SPWeb web = site.OpenWeb();
- SPList list = web.Lists["会议室预定"];
- ad.ListId = list.ID;
- txtTitle.ListId = list.ID;
- savebutton1.ListId = list.ID;
- rM.ListId = list.ID;
- user.ListId = list.ID;
- ad.Visible = true;
- Response.Write(list.ID);
- }
这个方法用在控件的Oninit上才有效哦,如果用到其他的地方就没有什么用拉,这个可以自己体会一下。
编辑和展示页面需要改动的地方:ControlMode, SharePoint:SaveButton,还有一个重要的改动就是需要添加一个ItemId属性。这样就ok了。
如果这些代码是放在路径是Lists/list22/…aspx下面的话,应该是不用指定ListId的,这个可以试一下,我还有进行验证!