Vitro-CAD

Система управления инженерными данными
Текущее время: 12 дек 2018, 13:34

Часовой пояс: UTC + 4 часа




 [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: 19 июн 2015, 11:13 
Администратор

Зарегистрирован: 18 июл 2014, 21:48
Сообщения: 80
Как в SharePoint не загружать все возможные значения лукапа (поля типа 'подстановка').

В SharePoint стандартный лукап представляет собой выпадающий список, в котором перечислены все возможные значения, которые данный лукап может принимать. Если лукап ссылается на список, в котором содержится очень много элементов, то загрузка всех возможных значений может сильно затормозить систему, или даже привести к ошибке.

Внешний вид поля можно переопределить при помощи технологии Client Side Rendering, которая появилась в SharePoint 2013. Можно вместо стандартного выпадающего списка, сделать поле с автодополнением. Но, несмотря на это, SharePoint при открытии формы все равно будет получать список всех возможных значений. Дело в том, что этот список передается в параметрах поля и может быть получен на клиенте при помощи JavaScript, например, следующим образом:
Код:
//JavaScript
createEditFormTemplate = function(context) {
    var fieldContext = SPClientTemplates.Utility.GetFormContextForCurrentField(context);
    var choises = fieldContext.fieldSchema.Choises; //список всех возможных значений
};

Для того чтобы список всех значений не загружался, нужно сделать свой тип поля - наследника от класса SPFieldLookup. Параметр, который содержит все возможные значения лукапа (Choises) заполняется в методе SPFieldLookup.GetJsonClientFormFieldSchema. Таким образом, в своем поле нужно переопределить функцию GetJsonClientFormFieldSchema:
Код:
public class CustomLookup : SPFieldLookup
{
     public override Dictionary<string, object> GetJsonClientFormFieldSchema(Microsoft.SharePoint.WebControls.SPControlMode mode)
    {
      ...
    }
}

В этой функции нужно сформировать список параметров, который потребуется для корректного отображнения поля. В базовом классе (SPField) этот метод реализован следующим образом:
Код:
public class SPField
{
    private Dictionary<string, object> m_fieldSchema;
    public virtual Dictionary<string, object> GetJsonClientFormFieldSchema(SPControlMode mode)
    {
        if (this.m_fieldSchema == null)
        {
            this.m_fieldSchema = new Dictionary<string, object>();
            this.m_fieldSchema["Id"] = (object) this.Id;
            this.m_fieldSchema["Title"] = (object) this.Title;
            this.m_fieldSchema["Hidden"] = (object) (bool) (this.Hidden ? 1 : 0);
            this.m_fieldSchema["IMEMode"] = (object) this.IMEMode;
            this.m_fieldSchema["Name"] = (object) this.InternalName;
            this.m_fieldSchema["Required"] = (object) (bool) (this.Required ? 1 : 0);
            this.m_fieldSchema["Direction"] = (object) this.Direction;
            this.m_fieldSchema["FieldType"] = (object) this.TypeAsString;
            this.m_fieldSchema["Description"] = (object) this.Description;
            this.m_fieldSchema["ReadOnlyField"] = (object) (bool) (this.ReadOnlyField ? 1 : 0);
            this.m_fieldSchema["Type"] = (object) ((object) this.GetTypeOrBaseTypeIfTypeIsInvalid()).ToString();
      }

      return this.m_fieldSchema;
    }
    ...
}


Можно взять эту реализацию за основу и добавить необходимых параметров.

_________________
Vitro-Cad Support Team

http://www.vitro-cad.com
http://www.vitrocad.com
http://www.vitro-cad.ru


Вернуться к началу
  
 
Показать сообщения за:  Поле сортировки  
 [ 1 сообщение ] 

Часовой пояс: UTC + 4 часа


 
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB