当前位置: 代码迷 >> SharePoint >> MOSS 2010 自定义字段类型,创建栏成功,但是打开添加列表内容出现异常,请教是咋回事
  详细解决方案

MOSS 2010 自定义字段类型,创建栏成功,但是打开添加列表内容出现异常,请教是咋回事

热度:314   发布时间:2016-05-02 06:58:39.0
MOSS 2010 自定义字段类型,创建栏成功,但是打开添加列表内容出现错误,请问是怎么回事?
要实现的自定义字段类型功能是,自定义一个可以验证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,应该足够了。
  相关解决方案