none
Обязательное заполнение поля элемента списка не работает при редактировании в режиме таблицы данных RRS feed

  • Вопрос

  • Доброго времени суток!

    Не являюсь разработчиком, поэтому, пожалуйста, не судите строго :).

    Сделал свой тип поля для ввода значения ИНН. Добавил его в список узла, при этом установил, что поле является обязательным для заполнения. В режиме добавления нового элемента или редактирования существующего проверка на заполнения выполняется. Но у пользователя по умолчанию список открывается в режиме таблицы данных, в нем он может добавить новый элемент, при этом поле, обязательное для заполнения, может быть и пустым. Никакого уведомления при этом нет.

    В чем может быть проблема?

    13 января 2015 г. 3:17

Ответы

  • Еще раз проверил на самом простом поле.

    В итоге ответ:

    ВСЕ кастомные поля в табличном представлении READ-ONLY, по этому от пользователя и не требуется их заполнения!

    Кстати и не только кастомные, а еще например управляемые метаданные, текстовый RichTextBox так же доступны только для чтенияостальные не проверял.

    • Помечено в качестве ответа alex7005 15 января 2015 г. 1:13
    13 января 2015 г. 11:20

Все ответы

  • Добрый день,

    Запретите редактирование в табличном представлении.


    13 января 2015 г. 4:12
  • Проверил Ваше предположение.

    В моем списке есть поле Дата (из встроенных типов полей). Сделал его обязательным для заполнения. В режиме таблице данных пробую сохранить строку с незаполненным значением Дата - получаю ошибку:

    Для поля "Дата" необходимо указать непустое значение.

    Выходит, что когда развертываешь свой тип поля, то надо учесть какой-то нюанс. Ведь встроенные типы проходят проверку даже в таблице данных (на всякий случай проверил для типа поля Денежный - ограничение тоже срабатывает).

    Запретить редактирование в табличном представлении - не самый хороший вариант, т.к. пользователИ предпочитают работать именно в таком режиме (быстрее редактировать сразу в строке, чем переходить на страницу редактирования).

    PS: но если подскажите, как можно отключить редактирование в табличном представлении, буду очень признателен.

    • Изменено alex7005 13 января 2015 г. 5:08
    13 января 2015 г. 4:35
  • Запретить редактирование:

    Список -> Параметры списка -> Дополнительные параметры ->

    13 января 2015 г. 5:18
  • А для списка Share Point Services 3.0 такие настройки возможны?
    13 января 2015 г. 5:32
  • А для списка Share Point Services 3.0 такие настройки возможны?
    Вот этого я вам не подскажу, я работаю с 2010 в основном и виртуалки с таким динозавром (WSS) у меня нет.
    13 января 2015 г. 5:35
  • Покажите XML definition этого поля.
    13 января 2015 г. 5:36
  • Надеюсь, это тот файл fldtypes_INN.xml

    <?xml version="1.0" encoding="utf-8"?>

    <FieldTypes> 

    <FieldType>   

    <Field Name="TypeName">INN</Field>   

    <Field Name="ParentType">Text</Field>   

    <Field Name="TypeDisplayName">ИНН</Field>

    <Field Name="TypeShortDescription">ИНН организации или физического лица</Field>

    <Field Name="UserCreatable">TRUE</Field>   

    <Field Name="ShowOnListCreate">TRUE</Field>   

    <Field Name="ShowOnSurveyCreate">TRUE</Field>   

    <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>   

    <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>   

    <Field Name="FieldTypeClass">DSM.SharePoint.INNField, DSM.SharePoint.INN_Field_Type, Version=1.0.0.0, Culture=neutral, PublicKeyToken=18d2b3c573007088</Field> 

    </FieldType>  

    </FieldTypes>


    13 января 2015 г. 5:46
  • Так как у вас поле наследуется от BaseTextField допишите к решению (DSM.SharePoint.INNField) в Visual Studio кастомный валидатор:

    public override string GetValidatedString(object value)
    {
        if (String.IsNullOrEmpty(value)) throw new SPFieldValidationException("Поле обязательно для заполнения");
       return base.GetValidatedString(value);
    } 

    Или перегрузите метод Validate.

    13 января 2015 г. 6:09
  • Или упростите себе задачу и вставьте стандартную проверку поля ИНН:

    =OR(AND(LEN([INN]=10),
    MOD(MOD(MID([INN],1,1)*2+MID([INN],2,1)*4+MID([INN],3,1)*10+
    
    MID([INN],4,1)*3+MID([INN],5,1)*5+MID([INN],6,1)*9+MID([INN],7,1)*4+
    MID([INN],8,1)*6+MID([INN],9,1)*8,11),10)-MID([INN],10,1)=0),
    AND(LEN([INN])=12, MOD(MOD(MID([INN],1,1)*7+MID([INN],2,1)*2+MID([INN],3,1)*4+
    
    MID([INN],4,1)*10+
    MID([INN],5,1)*3+MID([INN],6,1)*5+MID([INN],7,1)*9+MID([INN],8,1)*4+MID([INN],9,1)*6+
    
    MID([INN],10,1)*8,11),10)-
    MID([INN],LEN([INN])-1,1)=0,
    MOD(MOD(MID([INN],1,1)*3+
    MID([INN],2,1)*7+MID([INN],3,1)*2+MID([INN],4,1)*4+MID([INN],5,1)*10+
    MID([INN],6,1)*3+MID([INN],7,1)*5+MID([INN],8,1)*9+MID([INN],9,1)*4+
    
    MID([INN],10,1)*6+MID([INN],LEN([INN])-1,1)*8,11),10)-
    MID([INN],LEN([INN]),1)=0))

    13 января 2015 г. 6:20
  • Я переопределял так:

    public override string GetValidatedString(object value)
            {
                if ((this.Required == true)
                   &&
                   ((value == null)
                    ||
                   ((String)value == "")))
                {
                    throw new SPFieldValidationException(this.Title
                        + " должен быть заполнен. ИНН для ЮЛ содержит 10 цифр, для ФЛ - 12."); // поле ИНН, если для поля будет установлено обязательное заполнение
                }
                else
                {
                    INNValidationRule rule = new INNValidationRule();
                    ValidationResult result = rule.Validate(value, CultureInfo.InvariantCulture);
    
                    if (!result.IsValid)
                    {
                        throw new SPFieldValidationException((String)result.ErrorContent);
                    }
                    else
                    {
                        return base.GetValidatedString(value);
                    }
                }
            }// конец GetValidatedString

    Но попробую, как Вы советовали.

    13 января 2015 г. 6:34
  • Спасибо за готовый шаблон, но пока не требуется.
    13 января 2015 г. 6:38
  • Все у вас в валидаторе верно.

    Посмотрите в debug: if ((this.Required == true)  , сдается мне что Required возвращает False;

    А в стандартной форме валидация верно отрабатывает?

    13 января 2015 г. 6:44
  • Да, в стандартной форме проверка отрабатывает как требуется.

    13 января 2015 г. 8:37
  • Тогда давайте взглянем на XML схему списка.

    На том сайте выполните запрос:

    /_vti_bin/owssvr.dll?Cmd=ExportList&List={ListId}
    , где замените  ListId на свой ИД списка
    Сохраните XML схему списка, найдите в ней описание того кастомного поля и copy-paste сюда.

    (Второй вариант свернуть в шаблон и разобрать полученный STP)

    13 января 2015 г. 8:53
  • <Field 
    Type="INN" 
    DisplayName="ИНН" 
    Required="TRUE" 
    ID="{a816322a-822a-43ee-893c-98eb1a5be7e3}"
    SourceID="{e306f283-efb7-45eb-8486-7d54b59baee2}"
    StaticName="_x0418__x041d__x041d_"
    Name="_x0418__x041d__x041d_" 
    ColName="nvarchar4" 
    RowOrdinal="0" 
    Version="1" />
    Попробовал включить режим отладки, при просмотре в табличном виде метод GetValidatedString(object value)
    вообще не срабатывает.
    13 января 2015 г. 9:12
  • И в схеме списка все верно. Ушел разбираться в test-farm...
    13 января 2015 г. 9:30
  • Данное поле я сделал по аналогии с примером создания поля для хранения кода ISBN (http://msdn.microsoft.com/ru-ru/library/bb861799%28v=office.12%29.aspx).

    Только у меня класс ValidationRule намного проще, чем в данном примере.

    13 января 2015 г. 9:58
  • Итак, Research показал, что действительно custom field type в табличном представлении не обязателен для заполнения. Стандартные работают как надо.

    Вот такие вот дела...

    Надо бы стандартные типы разобрать... Ушел копать dll...

    13 января 2015 г. 10:50
  • Еще раз проверил на самом простом поле.

    В итоге ответ:

    ВСЕ кастомные поля в табличном представлении READ-ONLY, по этому от пользователя и не требуется их заполнения!

    Кстати и не только кастомные, а еще например управляемые метаданные, текстовый RichTextBox так же доступны только для чтенияостальные не проверял.

    • Помечено в качестве ответа alex7005 15 января 2015 г. 1:13
    13 января 2015 г. 11:20
  • Печально :(.

    Я помню года три назад нашел где-то статью на просторах сети, как отключать режим просмотра в таблице данных для списка (Share Point Services 3.0), а сейчас какая-то проблема с этим.

    13 января 2015 г. 13:03