Как мне создать многократно используемую форму нового элемента + желательно, я не хочу связывать эту форму с типом контента? Я хочу принудительно отобразить одно скрытое поле (это можно сделать на странице, но сделать невидимым или сделать на странице и отобразить) и установить значение поля программно (вот почему оно должно быть отображено - чтобы установить его значение).
У Google есть тонны информации о том, как создать пользовательскую форму списка с дизайнером sharepoint, но в моем случае я не хочу, чтобы дизайнер sharepoint пользовался преимуществами, которые вы видите ниже.
Чего я пытаюсь достичь
Я хочу иметь возможность создавать новую форму для создания элемента (я не хочу, чтобы это было по умолчанию). Чтобы открыть эту новую форму, я бы использовал CustomAction в меню ECB элемента. В этой форме я хочу принудительно отобразить одно скрытое поле и установить его значение программным способом.
Я хочу открыть эту форму из CustomAction ECB (контекстное меню элемента), поэтому я не хочу устанавливать ее в качестве нового шаблона формы по умолчанию для типа контента.
<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
<FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
<New>ListForm</New>
</FormTemplates>
</XmlDocument>
Идея № 1
Я мог бы создать собственный RenderingTemplate и установить новый шаблон формы Типа контента для моего вновь созданного шаблона.
Например, шаблон рендеринга OOTB ListForm:
<SharePoint:RenderingTemplate ID="ListForm" runat="server">
<Template>
<SPAN id='part1'>
<SharePoint:InformationBar runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator=" " runat="server">
<Template_RightButtons>
<SharePoint:NextPageButton runat="server"/>
<SharePoint:SaveButton runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
<SharePoint:FormToolBar runat="server"/>
<TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 cellspacing=0 width=100%>
<SharePoint:ChangeContentType runat="server"/>
<SharePoint:FolderFormFields runat="server"/>
<SharePoint:ListFieldIterator runat="server" />
<SharePoint:ApprovalStatus runat="server"/>
<SharePoint:FormComponent TemplateName="AttachmentRows" runat="server"/>
</TABLE>
<table cellpadding=0 cellspacing=0 width=100%><tr><td class="ms-formline"><IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></td></tr></table>
<TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px"><tr><td width=100%>
<SharePoint:ItemHiddenVersion runat="server"/>
<SharePoint:ParentInformationField runat="server"/>
<SharePoint:InitContentType runat="server"/>
<wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator=" " runat="server">
<Template_Buttons>
<SharePoint:CreatedModifiedInfo runat="server"/>
</Template_Buttons>
<Template_RightButtons>
<SharePoint:SaveButton runat="server"/>
<SharePoint:GoBackButton runat="server"/>
</Template_RightButtons>
</wssuc:ToolBar>
</td></tr></TABLE>
</SPAN>
<SharePoint:AttachmentUpload runat="server"/>
</Template>
</SharePoint:RenderingTemplate>
Мне нужно только такое незначительное изменение (измените встроенный ListFieldIterator на пользовательский ListFieldIterator):
<SharePoint:RenderingTemplate ID="NewRelatedListItemTemplate" runat="server">
...
<Balticovo:ListFieldIteratorExtended IncludeFields="RelatedItems" runat="server"/>
...
</SharePoint:RenderingTemplate>
Преимущества перед пользовательскими формами (SPD)
- Таким образом, форма не является "постоянной / статической". Если впоследствии к списку или типу контента будут добавлены новые поля списка, моя пользовательская форма отобразит их (это сделает ListFieldIterator).
Идея № 2
Может ли быть, что я изменяю существующий RenderingTemplate во время выполнения?
- Я бы взял шаблон "новые формы"
(Названный, например, ListForm или его
может быть другим, чем по умолчанию
ListForm) с
SPControlTemplateManager.GetTemplateByName("ListForm")
- Найти элемент управления ListIterator и добавить
имущество
TemplateName="ListItemFormFieldsWithRelatedItems"
- Визуализировать этот шаблон и вернуть его?
Короче говоря, я хотел бы создать RenderingTemplate программно, на лету, а затем использовать этот шаблон для рендеринга новой формы списка.
Преимущества
- Я получаю преимущество Идеи 1 +
- Таким образом, я получу бонус, даже если Шаблон изменится (с ListForm на CompanyCustomListForm), и моя настраиваемая форма не потеряет мою реализованную функциональность, если я решу изменить шаблон отображения типа контента позже (я могу создавать другие функции, не пытаясь помнить о том, чтобы переопределить этот конкретный материал или другие сторонние функции, не перевесит мою функциональность, если они используют пользовательские формы - слабая связь, правда?).
Теперь, возможно ли это (идея № 2) ...?