Рендеринг пользовательской формы / изменение существующего шаблона рендеринга во время выполнения - PullRequest
1 голос
/ 19 марта 2010

Как мне создать многократно используемую форму нового элемента + желательно, я не хочу связывать эту форму с типом контента? Я хочу принудительно отобразить одно скрытое поле (это можно сделать на странице, но сделать невидимым или сделать на странице и отобразить) и установить значение поля программно (вот почему оно должно быть отображено - чтобы установить его значение).

У 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="&nbsp;" 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="&nbsp;" 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 во время выполнения?

  1. Я бы взял шаблон "новые формы" (Названный, например, ListForm или его может быть другим, чем по умолчанию ListForm) с SPControlTemplateManager.GetTemplateByName("ListForm")
  2. Найти элемент управления ListIterator и добавить имущество TemplateName="ListItemFormFieldsWithRelatedItems"
  3. Визуализировать этот шаблон и вернуть его?

Короче говоря, я хотел бы создать RenderingTemplate программно, на лету, а затем использовать этот шаблон для рендеринга новой формы списка.

Преимущества

  • Я получаю преимущество Идеи 1 +
  • Таким образом, я получу бонус, даже если Шаблон изменится (с ListForm на CompanyCustomListForm), и моя настраиваемая форма не потеряет мою реализованную функциональность, если я решу изменить шаблон отображения типа контента позже (я могу создавать другие функции, не пытаясь помнить о том, чтобы переопределить этот конкретный материал или другие сторонние функции, не перевесит мою функциональность, если они используют пользовательские формы - слабая связь, правда?).

Теперь, возможно ли это (идея № 2) ...?

...