创建需要唯一值的自定义字段

时间:2009-03-18 10:35:03

标签: sharepoint sharepoint-2007 moss

我正在实现一个包含多个列的自定义列表定义。对其中一列的要求是,它只能包含唯一值。如果用户输入的值已存在于另一个列表项中,则必须显示验证错误。

是否有任何选项可以在列表定义或自定义字段类型中执行此OOTB?或者我是否需要自己实现此功能?

3 个答案:

答案 0 :(得分:3)

要确保列中的唯一值,您有两个可能的位置。

  1. 您可以覆盖字段类型的Validate()方法,并查询列表中具有相同值的项目,并相应地设置IsValid属性。

  2. 编写您自己的ItemAdding和ItemUpdating事件接收者以查询列表。

答案 1 :(得分:0)

我过去曾使用过以下内容。

  /// <summary>
            /// Override Validation to check to see if our list already contains an item with the same value
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public override string GetValidatedString(object value)
            {
                // Get Current List
                SPList thisList = ParentList;

                SPQuery keywordQuery = new SPQuery();

                // Check to see if the current field contains the value entered into field
                keywordQuery.Query = string.Format("<Where>" +
                         "<Eq>" +
                            "<FieldRef Name='{1}' />" +
                            "<Value Type='Text'>{0}</Value>" +
                         "</Eq>" +
                   "</Where>", value, InternalName);

                SPListItemCollection liKeywords = thisList.GetItems(keywordQuery);

                // Will return greater than 0 if it finds the value in the list
                if (liKeywords.Count > 0)
                {
                    // checks to see if the list item is being updated, if it is the same finds the same ID as the one being Validated
                    if (liKeywords[0].ID != SPContext.Current.ItemId)
                    {

                        // Show error message
                        throw new SPFieldValidationException(string.Format("An item called '{0}' already exists", value));
                    }
                }

                // return entered value if unique
                return base.GetValidatedString(value);
            }

HTH Phill

答案 2 :(得分:0)

http://www.codeplex.com/features提供了一个名为“唯一列策略”的开源功能,它可以解决您的问题而不会对新字段类型产生依赖。