- More than 20 years experience
- Complete assessments
- No agency fees
Error executing template "/Designs/ClientBase_generated/Grid/AdvancedGrid/RowTemplates/AdvancedGridConfiguration.cshtml" System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at CompiledRazorTemplates.Dynamic.RazorEngine_85c0bc489ad54aff82ee6198a1cb6e2f.Execute() in D:\dynamicweb.net\Solutions\Bluedesk\worldemp.cloud.dynamicweb-cms.com\files\Templates\Designs\ClientBase_generated\Grid\AdvancedGrid\RowTemplates\AdvancedGridConfiguration.cshtml:line 131 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.GridRowViewModel> 2 @using Dynamicweb; 3 @using Dynamicweb.Content 4 @using Dynamicweb.Content.Items; 5 6 @using Dynamicweb.Frontend 7 @using Bluedesk.DynamicWeb.ItemTypes; 8 9 @using Bluedesk.DynamicWeb.ItemTypes.Configuration; 10 @using Bluedesk.DynamicWeb.ItemTypes.Settings.Configuration; 11 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 12 @using Bluedesk.DynamicWeb.ItemTypes.Extensions; 13 14 @using System.Runtime.Caching; 15 16 @{ 17 var rowID = Model.Item.Id; 18 // var paragraphID = Pageview.CurrentParagraph.ID; 19 AdvancedGridConfiguration _data = new AdvancedGridConfiguration(); 20 21 int CacheTime = 5; 22 MemoryCache memCache = MemoryCache.Default; 23 string cacheKey = $"AdvancedGridConfiguration_{rowID}-{Pageview.AreaID}"; 24 25 if (Pageview.IsVisualEditorMode) 26 { 27 var cache = MemoryCache.Default; 28 memCache.Remove($"AdvancedGridConfiguration_{rowID}-{Pageview.AreaID}"); 29 } 30 31 if (memCache.Contains(cacheKey)) 32 { 33 _data = memCache.Get(cacheKey) as AdvancedGridConfiguration; 34 35 if (_data == null) 36 { 37 _data = Dynamicweb.Content.Services.Items.GetItem("AdvancedGridConfiguration", rowID.ToString()).ToCodeFirstItem<AdvancedGridConfiguration>() ?? new AdvancedGridConfiguration(); 38 memCache.Set(cacheKey, _data, DateTimeOffset.UtcNow.AddMinutes(CacheTime)); 39 40 } 41 42 } 43 else 44 { 45 _data = Dynamicweb.Content.Services.Items.GetItem("AdvancedGridConfiguration", rowID.ToString()).ToCodeFirstItem<AdvancedGridConfiguration>() ?? new AdvancedGridConfiguration(); 46 memCache.Set(cacheKey, _data, DateTimeOffset.UtcNow.AddMinutes(CacheTime)); 47 } 48 49 string GridTemplate = _data.GetGridTemplate(); 50 string height = !string.IsNullOrWhiteSpace(_data.Height.ToString()) ? _data.Height.ToString() + "px" : "none"; 51 52 string ContentAlignment = _data.ContentAlignment; 53 54 string VerticalAlign = "center"; 55 string HorizontalAlign = "center"; 56 57 } 58 59 60 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.GridRowViewModel> 61 @using Dynamicweb; 62 @using Dynamicweb.Frontend 63 @using Bluedesk.DynamicWeb.ItemTypes.BaseSolution; 64 65 @helper RenderButton(AdvancedGridButton button, PageView Pageview) 66 { 67 string Template = button.GetAdvancedButtonTemplate().Replace("{{ ButtonLink }}", button.GetLink(Pageview)); 68 69 if (!string.IsNullOrWhiteSpace(button.GetLink(Pageview))) 70 { 71 @Template; 72 } 73 } 74 75 76 @{ 77 Dictionary<string, string> GridAlignment = _data.GetContentAlignMent(ContentAlignment); 78 } 79 80 @{ 81 82 var template = new System.Text.StringBuilder(); 83 var stylesheet = new System.Text.StringBuilder(); 84 85 if (!int.TryParse(Dynamicweb.Context.Current?.Request?.Params?["AreaId"], out int areaid)) 86 { 87 int.TryParse(Dynamicweb.Context.Current?.Request?.Params?["PageID"], out int pageid); 88 if (pageid == 0) 89 { 90 int.TryParse(Dynamicweb.Context.Current?.Request?.Params?["ID"], out pageid); 91 } 92 if (pageid == 0) 93 { 94 pageid = Dynamicweb.Frontend.PageView.Current()?.ID ?? 1; 95 } 96 97 areaid = Dynamicweb.Services.Pages.GetPage(pageid == 0 ? 1 : pageid)?.AreaId ?? 0; 98 } 99 100 //int areaid = 1; 101 102 string BackgroundColor = _data.BackgroundColor?.GetColorCode(areaid) ?? ""; 103 string BackgroundImage = !string.IsNullOrWhiteSpace(_data.BackgroundImage) ? _data.BackgroundImage : ""; 104 string Header = _data.Header().HeaderFormatted("AdvancedGrid__header"); 105 string SubHeader = _data.SubHeader().HeaderFormatted("AdvancedGrid__subheader"); 106 //string BackgroundColor = !string.IsNullOrWhiteSpace(_data.BackgroundColor) ? _data.BackgroundColor : ""; 107 108 int RowCounter = 0; 109 110 stylesheet.AppendLine(".AdvancedGrid__container--" + _data.Id + "{"); 111 stylesheet.AppendLine("--BackgroundColor: " + BackgroundColor + ";"); 112 if (!string.IsNullOrWhiteSpace(BackgroundImage)) 113 { 114 stylesheet.AppendLine("--BackgroundImage: url('" + BackgroundImage + "');"); 115 } 116 stylesheet.AppendLine("}"); 117 118 if (!string.IsNullOrWhiteSpace(Header) || !string.IsNullOrWhiteSpace(SubHeader)) 119 { 120 121 template.AppendLine("<header class='AdvancedGrid__header-container'>"); 122 123 if (!string.IsNullOrWhiteSpace(Header)) { template.AppendLine(Header); } 124 if (!string.IsNullOrWhiteSpace(SubHeader)) { template.AppendLine(SubHeader); } 125 126 template.AppendLine("</header>"); 127 } 128 129 template.AppendLine("<article class='AdvancedGrid__container AdvancedGrid__container--" + _data.Id + "'>"); 130 131 foreach (ColumnConfigurationItem ColumnConfiguration in _data.ColumnConfiguration()) 132 { 133 134 string columnBackgroundColor = ColumnConfiguration.ColumnBackgroundColor?.GetColorCode(Pageview.AreaID) ?? "transparent"; 135 string columnFlexGrow = ColumnConfiguration.ColumnFlexGrow.ToString(); 136 string columnFlexBasis = ColumnConfiguration.ColumnFlexBasis.ToString(); 137 string columnFlexSchrink = ColumnConfiguration.ColumnFlexSchrink.ToString(); 138 string columnClass = ColumnConfiguration.CssClass?.ToString() ?? ""; 139 140 string columnPadding = ColumnConfiguration.ColumnPadding?.ToString() ?? ""; 141 142 string columnWidth = ColumnConfiguration.ColumnWidth == 0 ? "none" : ColumnConfiguration.ColumnWidth + "px;"; 143 string columnWidthClass = ColumnConfiguration.ColumnWidth != 0 ? ColumnConfiguration.ColumnWidthMinMax + "-width : " + ColumnConfiguration.ColumnWidth + "px;" : ""; 144 145 template.AppendLine("<section class='AdvancedGrid__column AdvancedGrid__column--" + ColumnConfiguration.Id + " " + columnClass + "' style='padding: var(--Padding);'>"); 146 147 stylesheet.AppendLine(".AdvancedGrid__column--" + ColumnConfiguration.Id + "{"); 148 stylesheet.AppendLine("--BackgroundColor: " + columnBackgroundColor + ";"); 149 stylesheet.AppendLine("--FlexGrow: " + columnFlexGrow + ";"); 150 stylesheet.AppendLine("--FlexBasis: " + columnFlexBasis + ";"); 151 stylesheet.AppendLine("--FlexSchrink: " + columnFlexSchrink + ";"); 152 stylesheet.AppendLine("--Width: " + columnWidth + ";"); 153 stylesheet.AppendLine("--Padding: " + columnPadding + ";"); 154 stylesheet.AppendLine(columnWidthClass); 155 stylesheet.AppendLine("}"); 156 157 foreach (RowConfigurationItem RowConfiguration in ColumnConfiguration.RowConfiguration()) 158 { 159 string rowBackgroundColor = RowConfiguration.BackgroundColor?.GetColorCode(areaid) ?? "transparent"; 160 string rowHeightClass = RowConfiguration.Height != 0 ? RowConfiguration.HeightMinMax + "-height : " + RowConfiguration.Height + "px;" : ""; 161 string rowClass = RowConfiguration.CssClass?.ToString() ?? ""; 162 // Dictionary<string, string> RowElementAlignment = GetContentAlignMent(RowConfiguration.ContentAlignment); 163 164 RowCounter++; 165 166 template.AppendLine($"<div class='AdvancedGrid__row AdvancedGrid__row--{RowConfiguration.Id} {rowClass}'>{Model.Column(RowCounter).Output()}</div>"); 167 168 stylesheet.AppendLine(".AdvancedGrid__row--" + RowConfiguration.Id + "{"); 169 stylesheet.AppendLine("--BackgroundColor: " + rowBackgroundColor + ";"); 170 // stylesheet.AppendLine("--VerticalAlign: " + RowElementAlignment["VerticalAlign"] + ";"); 171 // stylesheet.AppendLine("--HorinzontalAlign: " + RowElementAlignment["HorizontalAlign"] + ";"); 172 stylesheet.AppendLine(rowHeightClass); 173 stylesheet.AppendLine("}"); 174 } 175 176 template.AppendLine("</section>"); 177 178 } 179 180 template.AppendLine("</article>"); 181 182 } 183 184 <section class="AdvancedGrid AdvancedGrid--@rowID @_data.CssClass" style="--Height: @height;"> 185 186 @template.ToString() 187 <!--// Generate Buttons //--> 188 189 @if (!string.IsNullOrWhiteSpace(_data.Button().GetLink(Pageview)) && !string.IsNullOrWhiteSpace(_data.Button().ButtonText)) 190 { 191 <section class="AdvancedGrid__navigation"> 192 <nav class="cta-paragraph__btn-navigation"> 193 @RenderButton(_data.Button(), Pageview) 194 @RenderButton(_data.ExtraButton(), Pageview) 195 </nav> 196 </section> 197 } 198 199 <style> 200 @stylesheet.ToString() 201 </style> 202 203 <style> 204 .AdvancedGrid--@rowID .AdvancedGrid__row { 205 206 --VerticalAlign: @GridAlignment["VerticalAlign"]; 207 --HorinzontalAlign: @GridAlignment["HorizontalAlign"]; 208 209 align-items: var(--VerticalAlign); 210 justify-content: var(--HorinzontalAlign); 211 212 } 213 214 .AdvancedGrid__container--@rowID{ 215 --BackgroundImage: url('@_data.BackgroundImage'); 216 --BackgroundColor: @_data.BackgroundColor?.GetColorCode(Pageview.AreaID); 217 } 218 219 .AdvancedGrid__column { 220 background-color: var(--BackgroundColor); 221 222 flex-grow: var(--FlexGrow); 223 flex-basis: var(--FlexBasis); 224 flex-shrink: var(--FlexSchrink); 225 226 width: var(--Width); 227 padding: var(--Padding); 228 } 229 230 .AdvancedGrid__container--{ 231 background-color: transparent; 232 background-image: none; 233 } 234 235 </style> 236 237 </section> 238
Wat deze professional doet
Waar helpt jouw nieuwe collega je concreet mee?
Je kunt deze professional inzetten voor het traject van aanvraag tot voorstel. Denk aan het analyseren van RFQ’s en technische documentatie, het uitwerken van de E&I-scope en het opstellen van kostencalculaties met een duidelijke cost breakdown. De werkzaamheden zijn gericht op electrical en instrumentation in een industriële context.
Typische werkzaamheden:
- Techno-commercial offers en proposal writing voor E&I-scope
- RFQ-analyse en werken met P&ID’s en bijbehorende lijsten
- Kostencalculaties voor hardware, engineering, FAT/SAT, installatie en overheads
- Cable calculations en cable sizing volgens relevante IEC-standaarden
- Cost optimisation en value engineering binnen de afgesproken scope
Alle tools, normen en methodieken vind je in het volledige cv.
WorldEmp solves your capacity challenge
- Direct inzetbaar, voor minimaal 8 weken
- Beheerst de Engelse taal
- Ervaring met E&I-projecten in Europa, VS en Asia-Pacific
- Focus op proposals en kostencalculaties voor electrical en automation
- Vaste overeenkomst altijd mogelijk
In wat voor omgeving is deze Estimator E&I al ingezet?
Relevante ervaring en projecten
In het cv vind je ervaring met proposal development voor electrical en automation scope bij verschillende industriële installaties, onder meer in food and water, marine, energy en chemical. Daarnaast is er ervaring met plant instrumentation, maintenance en calibration in een chemische en industriële automatiseringsomgeving, en met installation en commissioning van onder andere een rioolwaterzuiveringsinstallatie en een biogasinstallatie.
Deze combinatie van proposal-werk en praktijkervaring in het veld maakt deze Estimator E&I inzetbaar voor organisaties die E&I-scope helder willen uitwerken en begroten. Specifieke projecten, verantwoordelijkheden en gebruikte systemen zijn volledig terug te lezen in het cv.
Direct beschikbare Estimator E&I voor jouw projecten
Hoe werkt dit in de praktijk met WorldEmp?
Samenwerking, werkwijze en volgende stap
Via WorldEmp sluit deze Estimator E&I aan als collega op afstand in jouw team. Samen stemmen we de rol, scope en startdatum af en plannen we een inhoudelijke kennismaking, zodat jij met eigen ogen kunt toetsen of de ervaring past bij jouw projecten en omgeving. WorldEmp werkt met een minimale inzet van 6 maanden, zodat je structureel capaciteit opbouwt en niet steeds opnieuw hoeft in te werken.
Wil je verder kijken of deze Estimator E&I past bij jouw vraagstuk, of eerst alle details bekijken?
Lijkt deze Estimator E&I iets voor jou?
Laat je gegevens achter, ik neem contact met je op!
Inge Kimsma is accountmanager bij WorldEmp en helpt je graag verder als deze Estimator E&I past bij wat jij zoekt. Samen kijk je naar jouw projecten, de rol die je wilt invullen en hoe deze internationale professional daar precies op kan aansluiten. Inge kan je het volledige cv toesturen en direct een kennismaking inplannen, zodat je snel weet of dit de juiste match is.
"Waarom wachten terwijl je projecten gewoon doorgaan? Laat je gegevens achter of bel me, dan stuur ik je het cv van deze Estimator E&I en regel ik een kennismaking."