要实现的自定义字段类型功能是,自定义一个可以验证Email格式的多行文本框。
我贴出来开发过程:
首先,我创建了一个空的sharepoint项目,命名为:ITSM.CustomFields
第二步,添加三个类文件,Email.Field.cs,Email.Field.Value.cs,Email.FieldControl.cs
第三步,添加User Control,EmailField.ascx
第四步,添加xml文件,fldtypes_Email.xml
最后我把第三步,第四步的文件都放到了指定目录下面,项目生成的DLL也注册到GAC中,重启了IIS
当我创建栏目时可以创建成功,但是当我回到列表页面,添加列表内容时,
页面报错,捕捉到的错误信息是:(大概就是我在ascx页面自定义的txtEmail文本框找不到)
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------
Corrupted EmailFieldRendering template - missing txtEmail.
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.ArgumentException: Corrupted EmailFieldRendering template - missing txtEmail.
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
[ArgumentException: Corrupted EmailFieldRendering template - missing txtEmail.]
ITSM.CustomFields.Field.EmailFieldControl.CreateChildControls() +622
System.Web.UI.Control.EnsureChildControls() +146
Microsoft.SharePoint.WebControls.BaseFieldControl.OnLoad(EventArgs e) +243
System.Web.UI.Control.LoadRecursive() +66
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Control.LoadRecursive() +191
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428
代码:
protected override void CreateChildControls()
{
try
{
if (Field == null)
return;
base.CreateChildControls();
if (ControlMode == SPControlMode.Display)
return;
txtEmail = (TextBox)TemplateContainer.FindControl("txtEmail");
//if (txtEmail == null)
txtEmail.ToolTip = Field.Title + "Email";
txtEmail.TabIndex = this.TabIndex;
txtEmail.CssClass = this.CssClass;
}
catch
{
throw new ArgumentException("Corrupted EmailFieldRendering template - missing txtEmail.");
}
------解决思路----------------------
自定义字段是一个 普通的用法。
今天没有时间分析你的代码了,你先参考 搞不定 。再回来研究。
http://www.cnblogs.com/flowman/archive/2012/10/31/2748049.html
------解决思路----------------------
验证email为嘛要多行文本?
自定义字段继承自单行文本,然后在保存是验证字段函数里,用正则验证是不是email,不是的话弹回错误,就OK了;
你是不是想的太复杂了?我觉得根本用不到控件,一个字段类,一个字段control类,一个字段类型描述的xml,应该足够了。