{"id":4249,"date":"2017-07-20T10:10:53","date_gmt":"2017-07-20T08:10:53","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=4249"},"modified":"2023-08-29T11:30:08","modified_gmt":"2023-08-29T09:30:08","slug":"kontrolka-delegatecontrol","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/kontrolka-delegatecontrol\/","title":{"rendered":"Kontrolka DelegateControl"},"content":{"rendered":"\n<p>Zdarzaj\u0105 si\u0119 momenty, w kt\u00f3rych chcieliby\u015bmy doda\u0107 do strony dodatkow\u0105 funkcjonalno\u015b\u0107, czy zmieni\u0107 wygl\u0105d strony. Nie mo\u017cemy jednak utworzy\u0107 nowej lub zmodyfikowa\u0107 ju\u017c istniej\u0105cej strony wzorcowej (master page), bo np. klient sobie tego nie \u017cyczy&nbsp;albo wi\u0105za\u0142oby si\u0119 to z du\u017cym nak\u0142adem pracy. W\u0142a\u015bnie w takim celu powsta\u0142a kontrolka DelegateControl.<\/p>\n\n\n\n<p>Jest to mechanizm dzia\u0142aj\u0105cy jako kontener. Umo\u017cliwia on wstrzykni\u0119cie kontrolki\/kontrolek w miejscu, gdzie kontrolka DelegateControl&nbsp; wyst\u0119puje. Podczas otwierania strony kontrolka DelegateControl szuka zarejestrowanych kontrolek. W przypadku znalezienia kontrolek, w zale\u017cno\u015bci od ustawie\u0144 kontrolki DelegateControl, w ich&nbsp;miejsce renderowana jest albo jedna, albo wszystkie.<\/p>\n\n\n\n<p>W ten spos\u00f3b, poprzez dodanie w\u0142asnych wpis\u00f3w lub wykorzystaniu ju\u017c istniej\u0105cych, na stronie wzorcowej mo\u017cna doda\u0107 nowe funkcjonalno\u015bci do wszystkich stron korzystaj\u0105cych z danej strony wzorcowej.<\/p>\n\n\n\n<p>Zatem zaczynajmy.<\/p>\n\n\n\n<p>Ka\u017cda \u201cpude\u0142kowa\u201d strona wzorcowa w bloku HEAD zawiera wpis:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;SharePoint:DelegateControl runat=&quot;server&quot;\n \nControlId=&quot;AdditionalPageHead&quot;\n \nAllowMultipleControls=&quot;true&quot;\/&gt;\n<\/pre><\/div>\n\n\n<p>gdzie:<\/p>\n\n\n\n<p><strong>ControlId<\/strong> \u2013 id identyfikuj\u0105ce kontrolk\u0119 DelegateControl,<\/p>\n\n\n\n<p><strong>AllowMultipleControls<\/strong> \u2013 okre\u015bla, czy kontrolka DelegateControl mo\u017ce wyrenderowa\u0107 kilka kontrolek czy tylko jedn\u0105.<\/p>\n\n\n\n<p>Jako przyk\u0142ad przygotujemy kontrolk\u0119 dodaj\u0105c\u0105 arkusz stylu CSS ukrywaj\u0105cego lewe menu boczne.<\/p>\n\n\n\n<p>Pozwoli to sprawdzi\u0107 w prosty spos\u00f3b, czy kod dzia\u0142a. Poza tym, bazuj\u0105c na moim do\u015bwiadczeniu, klienci nad wyraz cz\u0119sto chc\u0105 by to menu by\u0142o ukryte.<\/p>\n\n\n\n<p>Na pocz\u0105tek utworzymy now\u0105, farmow\u0105 solucj\u0119 SharePoint\u2019ow\u0105 BlogerSii.Examples.DelegateControl.<\/p>\n\n\n\n<p>W Visual Studio dodaj SharePoint\u2019owy folder \u201eLayouts\u201d<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_1_layouts.jpg\"><img decoding=\"async\" width=\"942\" height=\"656\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_1_layouts.jpg\" alt=\"SharePoint Layouts Mapped Folder\" class=\"wp-image-4262\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_1_layouts.jpg 942w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_1_layouts-300x209.jpg 300w\" sizes=\"(max-width: 942px) 100vw, 942px\" \/><\/a><\/figure>\n\n\n\n<p>Nast\u0119pnie dodaj do niego plik arkuszu styl\u00f3w CSS \u201eHideMenu.css\u201d.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_2_hidemenu_css.jpg\"><img decoding=\"async\" width=\"271\" height=\"240\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_2_hidemenu_css.jpg\" alt=\"Layout - DelegateControl\" class=\"wp-image-4255\"\/><\/a><\/figure>\n\n\n\n<p>Wklej do nowo utworzonego pliku definicji stylu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: css; title: ; notranslate\" title=\"\">\n#sideNavBox { \ndisplay:none; \n}\n<\/pre><\/div>\n\n\n<p>W Visual Studio dodaj nowy User Control HideSideMenuControl.ascx<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_3_hidemenucontrol.jpg\"><img decoding=\"async\" width=\"870\" height=\"236\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_3_hidemenucontrol.jpg\" alt=\"Add New Item - User Control\" class=\"wp-image-4256\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_3_hidemenucontrol.jpg 870w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_3_hidemenucontrol-300x81.jpg 300w\" sizes=\"(max-width: 870px) 100vw, 870px\" \/><\/a><\/figure>\n\n\n\n<p>Do pliku HideSideMenuControl.ascx dodaj wpis:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;link rel=&quot;stylesheet&quot; href=&quot;\/_layouts\/15\/DelegateControl\/HideMenu.css&quot; \/&gt;\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_4_hidemenucontrol_2.jpg\"><img decoding=\"async\" width=\"732\" height=\"206\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_4_hidemenucontrol_2.jpg\" alt=\"\" class=\"wp-image-4257\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_4_hidemenucontrol_2.jpg 732w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_4_hidemenucontrol_2-300x84.jpg 300w\" sizes=\"(max-width: 732px) 100vw, 732px\" \/><\/a><\/figure>\n\n\n\n<p>Mamy ju\u017c kontrolk\u0119 &#8211; teraz trzeba j\u0105 wykorzysta\u0107.<\/p>\n\n\n\n<p>S\u0142u\u017cy do tego odpowiednio przygotowany dokument XML.<\/p>\n\n\n\n<p>W Visual Studio dodaj \u201eEmpty Element\u201d. W Elements.xml dodaj wpis:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n\t&lt;Control Id=&quot;AdditionalPageHead&quot; Sequence=&quot;90&quot; ControlSrc=&quot;~\/_CONTROLTEMPLATES\/15\/DelegateControl\/HideSideMenuControl.ascx &quot; \/&gt;\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_5_elementsxml.jpg\"><img decoding=\"async\" width=\"872\" height=\"149\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_5_elementsxml.jpg\" alt=\"Elements.xml\" class=\"wp-image-4258\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_5_elementsxml.jpg 872w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_5_elementsxml-300x51.jpg 300w\" sizes=\"(max-width: 872px) 100vw, 872px\" \/><\/a><\/figure>\n\n\n\n<p>Tak przygotowany dokument XML pozwala na powi\u0105zanie kontrolki ASP.NET z kontrolk\u0105 DelegateControl, gdzie:<\/p>\n\n\n\n<p><strong>ID<\/strong> &#8211; definiuje, kt\u00f3ra kontrolka DelegateControl ma wyrenderowa\u0107 nasz\u0105 kontrolk\u0119,<\/p>\n\n\n\n<p><strong>Sequence<\/strong> \u2013 w przypadku, gdy kontrolka DelegateControl nie ma flagi AllowMultipleControls ustawionej na \u201etrue\u201d lub w og\u00f3le jej nie ma, o tym, kt\u00f3ra kontrolka zostanie wstrzykni\u0119ta, decyduje sequence &#8211; wygrywa ta, kt\u00f3ra ma najni\u017csz\u0105 warto\u015b\u0107,<\/p>\n\n\n\n<p><strong>ControlSrc<\/strong> \u2013 lokalizacja wstrzykiwanego elementu.<\/p>\n\n\n\n<p>Utworzony element nale\u017cy doda\u0107 do funkcji (feature) o zakresie (scope) \u201eWeb\u201d.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_6_feature.jpg\"><img decoding=\"async\" width=\"1374\" height=\"298\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_6_feature.jpg\" alt=\"Scope - Web\" class=\"wp-image-4259\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_6_feature.jpg 1374w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_6_feature-300x65.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_6_feature-1024x222.jpg 1024w\" sizes=\"(max-width: 1374px) 100vw, 1374px\" \/><\/a><\/figure>\n\n\n\n<p>Zasi\u0119g elementu jest zale\u017cny od zakresu (scope) funkcji (feature), do kt\u00f3rej dodajemy element z naszym plikiem XML:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Farm \u2013 ca\u0142a farma,<\/li>\n\n\n\n<li>WebApp \u2013 web aplikacja,<\/li>\n\n\n\n<li>Site \u2013 kolekcja witryn,<\/li>\n\n\n\n<li>Web \u2013 konkretna witryna.<\/li>\n<\/ul>\n\n\n\n<p>Efekt przed:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_7_before.jpg\"><img decoding=\"async\" width=\"832\" height=\"454\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_7_before.jpg\" alt=\"screen SharePoint z menu bocznym\" class=\"wp-image-4260\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_7_before.jpg 832w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_7_before-300x164.jpg 300w\" sizes=\"(max-width: 832px) 100vw, 832px\" \/><\/a><\/figure>\n\n\n\n<p>Efekt po:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_8_after.jpg\"><img decoding=\"async\" width=\"605\" height=\"229\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_8_after.jpg\" alt=\"Screen Sharepoint bez menu bocznego\" class=\"wp-image-4261\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_8_after.jpg 605w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/delegatecontrol_8_after-300x114.jpg 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/a><\/figure>\n\n\n\n<p>Jak wida\u0107 nasz arkusz styl\u00f3w CSS zosta\u0142 dodany, menu boczne znikn\u0119\u0142o.<\/p>\n\n\n\n<p>Wykorzystanie kontrolki DelegateControl w SharePoint\u2019cie jest bardzo prostym i efektywnym sposobem na dokonanie zmian o du\u017cym zasi\u0119gu.<\/p>\n\n\n\n<p>Efektem ko\u0144cowym naszego przyk\u0142adu by\u0142o dodanie arkusza styl\u00f3w CSS, jednak mo\u017cliwo\u015bci jakie daje to rozwi\u0105zanie s\u0105 ograniczone jedynie przez API i wyobra\u017ani\u0119 samego programisty.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;4249&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5 ( votes: 0)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Kontrolka DelegateControl&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zdarzaj\u0105 si\u0119 momenty, w kt\u00f3rych chcieliby\u015bmy doda\u0107 do strony dodatkow\u0105 funkcjonalno\u015b\u0107, czy zmieni\u0107 wygl\u0105d strony. Nie mo\u017cemy jednak utworzy\u0107 nowej &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/kontrolka-delegatecontrol\/\">Continued<\/a><\/p>\n","protected":false},"author":127,"featured_media":4286,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[56,486,485],"class_list":["post-4249","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-sharepoint","tag-customization","tag-delegatecontrol"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/07\/header-sharepoint.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/4249"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/127"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=4249"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/4249\/revisions"}],"predecessor-version":[{"id":23881,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/4249\/revisions\/23881"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/4286"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=4249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=4249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=4249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}