我正在实现一个包含多个列的自定义列表定义。对其中一列的要求是,它只能包含唯一值。如果用户输入的值已存在于另一个列表项中,则必须显示验证错误。
是否有任何选项可以在列表定义或自定义字段类型中执行此OOTB?或者我是否需要自己实现此功能?
答案 0 :(得分:3)
要确保列中的唯一值,您有两个可能的位置。
您可以覆盖字段类型的Validate()方法,并查询列表中具有相同值的项目,并相应地设置IsValid属性。
编写您自己的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提供了一个名为“唯一列策略”的开源功能,它可以解决您的问题而不会对新字段类型产生依赖。