V17 Rendering Issues - Comprehensive Scan¶
Date: 2026-02-27
Scan scope: C:\repos\progress\dbl.Progress\src\www\Views\ (all .cshtml files)
Updated Feb 28, 2026
The DropDown.Flexible migration root cause was FIXED in commit 4168abe — see Report 31. Additional runtime issues discovered — see Report 32 for comprehensive findings including cache busting, case sensitivity, calculator deep-dive, and backend service gaps.
Summary¶
| Category | Count | Severity | Status |
|---|---|---|---|
| 1. IPublishedContent vs MediaWithCrops | 87 occurrences in 53 files | CRITICAL | OPEN |
| 2. DropDown.Flexible without try-catch | 18+ occurrences in 12+ files | HIGH | OPEN (migration fix done, views still need SafeDropdownValue) |
| 3. MasterLogin missing RenderScripts | 1 file | HIGH | OPEN |
| 4. Cache busting missing | ~100+ script/link tags | CRITICAL | NEW (Report 32) |
| 5. External CDN dependencies (unpkg) | 18 occurrences in 9 files | MEDIUM | OPEN |
| 6. Case sensitivity paths | 14 broken references | HIGH | NEW (Report 32) |
| 7. Bootstrap 4 patterns | 0 in views (CLEAN) | -- | -- |
| 8. Hardcoded URLs / API keys | 0 hardcoded keys (proper config) | -- | -- |
| 9. sr-only / old BS4 spacing classes | 0 in views (CLEAN) | -- | -- |
| 10. Missing null-safe Link patterns | Most have null checks (LOW risk) | LOW | -- |
| 11. jQuery fallback version mismatch | 5 master layouts | LOW | -- |
1. IPublishedContent vs MediaWithCrops (CRITICAL)¶
Problem: v17 MediaPicker3 returns MediaWithCrops, not IPublishedContent. Using Value<IPublishedContent>() returns null silently, so images/media simply don't render.
Owner: Joao (Razor/MVC)
53 Affected Files (87 occurrences)¶
Page Templates (10 files)¶
| File | Line | Property | Pattern |
|---|---|---|---|
Views\articleList.cshtml |
9 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\contactus.cshtml |
12 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\cookies.cshtml |
21,23,30 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\CustomerOnlyPage1.cshtml |
15 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\error.cshtml |
12 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\search.cshtml |
26 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\standardPage.cshtml |
12 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\standardPageWow.cshtml |
26 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\termsAndConditions.cshtml |
16,18,25 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\TermsAndConditionsMobile.cshtml |
16,18,25 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\testimonials.cshtml |
16 | headerImage |
Value<IPublishedContent>("headerImage") |
Views\gallery.cshtml |
66 | galleryImage |
item.Value<IPublishedContent>("galleryImage") |
Partials - calcGridSlider (4 files)¶
| File | Line | Properties |
|---|---|---|
Partials\calcGridSlider\youTubeVideo.cshtml |
22 | image |
Partials\calcGridSlider\splitPictureSlide.cshtml |
9,10,11 | firstSeparator, mainImage, secondSeperator |
Partials\calcGridSlider\pictureSlide.cshtml |
23 | picture / Picture |
Partials\calcGridSlider\pictureTextBox.cshtml |
22 | image |
Partials\calcGridSlider\internalVideo.cshtml |
22,53 | image, internalVideo |
Partials - home (5 files)¶
| File | Line | Properties |
|---|---|---|
Partials\home\internalVideo.cshtml |
18,23 | image, internalVideo |
Partials\home\pictureSlide.cshtml |
13 | image |
Partials\home\youTubeVideo.cshtml |
18 | image |
Partials\home\pictureTextBox.cshtml |
20 | image |
Partials\home\vimeoVideo.cshtml |
18 | image |
Partials\home\slider.cshtml |
13 | slider (IEnumerable |
Partials - news (3 files)¶
| File | Line | Properties |
|---|---|---|
Partials\news\topStory5Articles.cshtml |
60,124 | articleCategoryPicker |
Partials\news\topStory.cshtml |
74,151 | articleCategoryPicker |
Partials\news\NewsList.cshtml |
62 | articleCategoryPicker |
Partials - LatestArticles (3 files)¶
| File | Line | Properties |
|---|---|---|
Partials\LatestArticlesPaging.cshtml |
56 | articleCategoryPicker |
Partials\LatestArticles.cshtml |
27 | articleCategoryPicker |
Views\LatestArticlesPaging.cshtml |
56 | articleCategoryPicker |
Partials - blockgrid Components (25 files)¶
| File | Line | Properties |
|---|---|---|
blockgrid\Components\audioTagElement.cshtml |
10 | audioTag |
blockgrid\Components\cardGridControls.cshtml |
36,38 | image, icon |
blockgrid\Components\careerWidgetListControl.cshtml |
19 | careerParent |
blockgrid\Components\careerWidgetControl.cshtml |
25 | careerParent |
blockgrid\Components\contactUsWidget.cshtml |
22,24,32,34,94,96 | contactUsIcon, sectionIcon, icon |
blockgrid\Components\counter.cshtml |
19,22 | image, backgroundImage |
blockgrid\Components\cTAItem.cshtml |
15 | backgroundImage |
blockgrid\Components\ctaCurves.cshtml |
40,42,45,47,51,53 | Image, firstCurve, secondCurve |
blockgrid\Components\ctaElement.cshtml |
15 | backgroundImage |
blockgrid\Components\faqItems.cshtml |
62 | faqs (content picker, not media) |
blockgrid\Components\featureControls.cshtml |
31,32 | image, extraImage |
blockgrid\Components\grid_element_largeleafletmap.cshtml |
63 | mapPin |
blockgrid\Components\imageGalleryControl.cshtml |
27,29,69,72,114,116 | image |
blockgrid\Components\imageListControl.cshtml |
25 | image |
blockgrid\Components\imageWithLink.cshtml |
22 | image |
blockgrid\Components\parallaxImageItem.cshtml |
28,30 | Image |
blockgrid\Components\staffMemberControl.cshtml |
34,38 | staffMemberImage |
blockgrid\Components\staffMembersControl.cshtml |
32,36 | staffMemberImage |
blockgrid\Components\testimonialCardItem.cshtml |
35,47 | testimonialCategory (content picker) |
blockgrid\Components\videoPopout.cshtml |
12,15 | internalVideo, image |
blockgrid\Components\videoFullWidth.cshtml |
16 | internalVideo |
Other Partials¶
| File | Line | Properties |
|---|---|---|
Partials\blocklist\Components\headerContact.cshtml |
70 | icon |
Partials\RelatedArticlesType2.cshtml |
12 | articleCategoryPicker |
Partials\RelatedArticles.cshtml |
13 | articleCategoryPicker |
Partials\SiteLayout\SEO.cshtml |
51 | openGraphImage |
Fix pattern: Change Value<IPublishedContent>("alias") to Value<MediaWithCrops>("alias") and use .MediaUrl() instead of .Url().
Note: Some of these (articleCategoryPicker, faqs, careerParent, testimonialCategory) are content pickers not media pickers. For content pickers, IPublishedContent is actually correct in v17. Verify datatype before changing.
2. DropDown.Flexible Without try-catch (HIGH)¶
Root cause FIXED
Migration tool fix applied (commit 4168abe). GridValueTypeConverter.ConvertDropdownValue() now returns string instead of JArray. See Report 31 for definitive analysis. After re-migration, dropdown values are correctly double-encoded strings inside block JSON. Views still need SafeDropdownValue() as defense layer for previously-migrated data.
Problem: v8 DropDown.Flexible values are JSON arrays ["value"]; v17 FlexibleDropdownPropertyValueConverter expects the same format. Inside block JSON, values must be double-encoded strings "[\"value\"]". Without try-catch or SafeDropdownValue(), Value<string>() can throw JsonException.
Owner: Joao (Razor/MVC)
Files NOT using try-catch or SafeDropdownValue¶
| File | Line | Property | Current Code |
|---|---|---|---|
blockgrid\Components\announcementControls.cshtml |
13 | display |
content.Value<string>("display") -- NO try-catch |
blockgrid\Components\ctaCurves.cshtml |
33,35 | gradient |
content.Value<string>("gradient") -- NO try-catch |
blockgrid\Components\ctaCurves.cshtml |
68,70 | buttonStyle |
content.Value<string>("buttonStyle") -- NO try-catch |
blockgrid\Components\flipCardControls.cshtml |
18,20 | flip |
content.Value<string>("flip") -- NO try-catch |
blockgrid\Components\cardGridControls.cshtml |
37 | imageLocation |
item.Value<string>("imageLocation") -- NO try-catch |
blockgrid\Components\grid_element_loanboxescompletegrideditor.cshtml |
17 | display |
content.Value<string>("display") -- NO try-catch |
blockgrid\Components\grid_element_services_list_image.cshtml |
69 | gradient |
settings.Value<string>("gradient") -- NO try-catch |
blockgrid\Components\iconListOptContactInfoControl.cshtml |
92 | buttonClass |
item.Value<string>("buttonClass") -- NO try-catch |
blockgrid\Components\iconListOptContactInfoControl.cshtml |
197 | buttonClass |
item.Value<string>("buttonClass") -- NO try-catch |
Views\standardPageWithImageText.cshtml |
27 | buttonClass |
Model.Value<string>("buttonClass") -- NO try-catch |
Files already using try-catch (GOOD - no action needed)¶
These are correctly wrapped and safe:
- accordionButtonElement.cshtml (lines 31, 68) -- buttonClass
- accordionButtonMain.cshtml (lines 35, 78) -- buttonClass
- headerNew.cshtml (lines 45, 50) -- gradient, buttonStyle
- headerNews.cshtml (line 35) -- gradient
- NewsGlobalCTA.cshtml (lines 53, 64) -- buttonStyle, gradient
- cardItem.cshtml (line 28) -- imageLocation
- faqElement.cshtml (line 15) -- flip
- testimonialCardItem.cshtml (lines 25, 33) -- imageLocation, gradient
- mainLoanBoxWidget.cshtml (line 159) -- buttonClass
- _CardText.cshtml (line 15) -- imageLocation
- _CardItemContent.cshtml (line 15) -- imageLocation
- splitPictureSlide.cshtml (lines 18, 20) -- gradient, buttonStyle
Files using SafeDropdownValue (GOOD - no action needed)¶
14 usages across files like heroElement.cshtml, heroItem.cshtml, ctaText.cshtml, splitPictureSlider.cshtml, spotlightControls.cshtml, spotlightGridControls.cshtml, footerListControl.cshtml, calculatorControls.cshtml, careerWidgetControl.cshtml, announcementItemScrollControls.cshtml.
3. MasterLogin Missing RenderScripts (HIGH)¶
Problem: MasterLogin.cshtml registers 10+ scripts via Html.RequiresJs() (lines 99-117) but has Layout = null and never calls Html.RenderScripts(). Scripts are silently discarded.
Owner: Joao (Razor/MVC)
| File | Lines | Issue |
|---|---|---|
Views\MasterLogin.cshtml |
99-117 | Html.RequiresJs() calls for slick, bootstrap, fancybox, lazysizes, progressCore -- none rendered |
Fix: Either add @Html.RenderScripts() before </body>, or replace RequiresJs() calls with direct <script> tags (like master.cshtml pattern).
4. External CDN Dependencies - unpkg.com (MEDIUM)¶
Problem: 9 page templates load AOS (Animate on Scroll) v2.3.1 from unpkg.com. This is a reliability/performance risk -- should be vendored locally.
Owner: Rodrigo (CSS/JS)
| File | Lines |
|---|---|
Views\Faq.cshtml |
16-17 |
Views\home.cshtml |
16-17 |
Views\homeFullWidthSection.cshtml |
11-12 |
Views\homeGrid.cshtml |
16-17 |
Views\standardPageNew.cshtml |
15-16 |
Views\StandardPageThirdParty.cshtml |
17-18 |
Views\standardPageWow.cshtml |
13,16 |
Views\standardPageWithImageText.cshtml |
12-13 |
Views\TokenAuthentication.cshtml |
11-12 |
Fix: Download aos.css and aos.js to ~/vendor/aos/ and reference locally.
5. Bootstrap-datepicker from cdnjs (MEDIUM)¶
Problem: Three master layouts reference bootstrap-datepicker v1.3.0 (JS) and v1.7.0 (CSS) from cdnjs. Version mismatch between CSS and JS. Also, bootstrap-datepicker may not be BS5-compatible.
Owner: Rodrigo (CSS/JS)
| File | Lines |
|---|---|
Views\MasterLogin.cshtml |
121-122 |
Views\MasterThirdParty.cshtml |
120, 250 |
Views\master.cshtml |
124, 254 |
6. jQuery Fallback Version Mismatch (LOW)¶
Problem: Primary jQuery is 3.6.0 (CDN), but fallback is 3.5.1 (local). Minor issue but should be consistent.
Owner: Rodrigo (CSS/JS)
| File | Line | Primary | Fallback |
|---|---|---|---|
Views\master.cshtml |
161-162 | 3.6.0 | 3.5.1 |
Views\MasterLogin.cshtml |
67-68 | 3.6.0 | 3.5.1 |
Views\MasterThirdParty.cshtml |
157-158 | 3.6.0 | 3.5.1 |
Views\masterNoHeaderNof.cshtml |
78-79 | 3.6.0 | 3.5.1 |
Views\masterNoHeaderNoFooter.cshtml |
79-80 | 3.6.0 | 3.5.1 |
7. Items Verified CLEAN¶
No Bootstrap 4 data attributes in Views¶
data-toggle-- 0 occurrences (all converted todata-bs-toggle)data-dismiss-- 0 occurrencesdata-parent-- 0 occurrences (all converted todata-bs-parent)data-target-- 2 occurrences inquickLinkDropDownControl.cshtmlbut these are custom attributes on<option>elements used by bootstrap-select, NOT Bootstrap 4 toggle attributesdata-slides-to-show/data-slides-to-scrollingridslider.cshtml-- Slick Carousel custom attributes, not Bootstrap
No sr-only classes in Views¶
All screen-reader classes appear to be updated.
No old Bootstrap spacing (ml-, mr-, pl-, pr-) in Views¶
Clean -- all using BS5 ms-/me-/ps-/pe- or custom CSS.
No hardcoded API keys in Views¶
Google Maps API key properly loaded from Configuration["ProgressSettings:GoogleMapsApiKey"] in all 3 map components.
No hardcoded localhost/localtest.me URLs¶
Clean.
No connection strings in Views¶
Clean.
RequiresCss/RequiresJs are functional¶
Custom helpers (ScriptHelper.cs, CssHelper.cs) provide working drop-in replacements. All master layouts (except MasterLogin) properly call RenderScripts() and RenderCss().
Priority Fix List¶
P0 -- CRITICAL (will break rendering)¶
- 87 IPublishedContent usages in 53 files -- images/media silently null Owner: Joao | Effort: ~4h (mechanical find-replace with type verification)
P1 -- HIGH (will throw exceptions)¶
-
10 unprotected dropdown reads in 6 files -- JsonException on page load Owner: Joao | Effort: ~1h (wrap in try-catch or convert to SafeDropdownValue)
-
MasterLogin missing RenderScripts -- login page has no JS Owner: Joao | Effort: ~15min
P2 -- MEDIUM (reliability/performance)¶
-
AOS from unpkg.com in 9 files -- external CDN dependency Owner: Rodrigo | Effort: ~30min (vendor locally)
-
bootstrap-datepicker version mismatch -- CSS v1.7.0 vs JS v1.3.0 Owner: Rodrigo | Effort: ~30min
P3 -- LOW (cosmetic/consistency)¶
- jQuery fallback version mismatch -- 3.6.0 primary vs 3.5.1 fallback Owner: Rodrigo | Effort: ~15min