Extended View Model Error with Upgrade (Type Passed is A but Dictionary Requires B)

We are attempting to upgrade our site from 14.4 to 15.4 and everything is working smoothly for the most part except for one big issue with our Card Widget.

 

We have extended the built in Card Widget to include fields that dictate style and color (see attached). It works just fine on our production site (which is still on 14.4) but on our dev site (upgraded to 15.4) everywhere there is a view that references the extended view model, (Website.Sitefinity.Mvc.Models.Card.ExtCardViewModel) it throws back an error.

 

"Type : System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Message : ‹‹‹The model item passed into the dictionary is of type 'Telerik.Sitefinity.Frontend.Card.Mvc.Models.Card.CardViewModel', but this dictionary requires a model item of type 'Website.Sitefinity.Mvc.Models.Card.ExtCardViewModel'.›››

Source : System.Web.Mvc"

 

We are not sure why this is suddenly happening but we need it resolved before we can upgrade our production server. If anyone has any insight on why this might be happening, that would be amazingly helpful.

 

Card View Model (ExtCardViewModel.cs)

  1. using System.Web;
  2. using Telerik.Sitefinity.Frontend.Card.Mvc.Models.Card;
  3. using Telerik.Sitefinity.Frontend.Mvc.Models;
  4. using Telerik.Sitefinity.Web;
  5.  
  6. namespace FLDFS.MyFloridaCfo.Sitefinity.Mvc.Models.Card
  7. {
  8. public class ExtCardViewModel : CardViewModel
  9. {
  10. public ExtCardViewModel() : base()
  11. {
  12. }
  13. public bool OpenInNewTab {get; set;}
  14. public string CardTarget { get; set; }
  15. public bool FlexOrStatic { get; set; }
  16. public string CardHeight { get; set; }
  17. public string CardStyle { get; set; }
  18. public string CardWidth { get; set; }
  19.  
  20. }
  21. }

 Card Model (ExtCardModel.cs)

  1. using System;
  2. using Telerik.Sitefinity.Frontend.Card.Mvc.Models.Card;
  3. using Telerik.Sitefinity.Modules.Pages.Web.Services;
  4. using SfImage = Telerik.Sitefinity.Libraries.Model.Image;
  5. using System.ComponentModel;
  6. using Progress.Sitefinity.Renderer.Entities.Content;
  7. using Progress.Sitefinity.Renderer.Designers.Attributes;
  8. using System.Globalization;
  9. using System.Linq;
  10. using Telerik.Sitefinity.Configuration;
  11. using Telerik.Sitefinity.Data;
  12. using Telerik.Sitefinity.Modules;
  13. using Telerik.Sitefinity.Modules.GenericContent;
  14. using Telerik.Sitefinity.Modules.Libraries;
  15. using Telerik.Sitefinity.Modules.Pages;
  16. using Telerik.Sitefinity.Pages.Model;
  17. using Telerik.Sitefinity.Services;
  18. using Telerik.Sitefinity.Web;
  19.  
  20. namespace FLDFS.MyFloridaCfo.Sitefinity.Mvc.Models.Card
  21. {
  22. [TypeConverter(typeof(ExpandableObjectConverter))]
  23. //The ReflectInheritedProperties attribute instructs Sitefinity to look at the concrete implementation of the class for resolving properties instead of the interface.
  24. [ReflectInheritedProperties]
  25. public class ExtCardModel : CardModel
  26. {
  27. public ExtCardModel() : base()
  28. {
  29. }
  30. /// <summary>
  31. /// New or Same Tab
  32. /// </summary>
  33. public bool OpenInNewTab { get; set; }
  34. public string Target()
  35. {
  36. if (OpenInNewTab == true)
  37. { return "_blank"; }
  38. else
  39. { return ""; }
  40. }
  41.  
  42. /// <summary>
  43. /// Set Card Height
  44. /// </summary>
  45. public bool FlexOrStatic { get; set; }
  46. public string CardHeight()
  47. {
  48. if (FlexOrStatic == true)
  49. { return "full-height"; }
  50. else
  51. { return ""; }
  52. }
  53. public string CardStyle { get; set; }
  54.  
  55. public string CardWidth { get; set; }
  56.  
  57. public override CardViewModel GetViewModel()
  58. {
  59. var viewModel = new ExtCardViewModel()
  60. {
  61. Heading = this.Heading,
  62. Description = this.Description,
  63. ActionName = this.ActionName,
  64. ActionUrl = this.GetLinkedUrl(),
  65. CssClass = this.CssClass,
  66. CardTarget = this.Target(),
  67. CardHeight = this.CardHeight(),
  68. CardStyle = this.CardStyle,
  69. CardWidth = this.CardWidth,
  70. };
  71.  
  72. SfImage image;
  73. if (this.ImageId != Guid.Empty)
  74. {
  75. image = this.GetImage();
  76. if (image != null)
  77. {
  78. viewModel.SelectedSizeUrl = this.GetSelectedSizeUrl(image);
  79. viewModel.ImageAlternativeText = image.AlternativeText;
  80. viewModel.ImageTitle = image.Title;
  81. }
  82. }
  83. return viewModel;
  84. }
  85. }
  86. }

 Card View (Card.cshtml)

 

  1. @model FLDFS.MyFloridaCfo.Sitefinity.Mvc.Models.Card.ExtCardViewModel
  2. @using Telerik.Sitefinity.Frontend.Mvc.Helpers;
  3.  
  4. @Html.StyleSheet(Url.Content("~/ResourcePackages/FLDFS/css/CardExt.min.css"), "head", true)
  5.  
  6. @ if (string.Equals(Model.CardStyle, "hero"))
  7. {
  8. <hero>
  9. <div style="background: url( @Model.SelectedSizeUrl ) center center; background-size:cover">
  10. <div class="container text-box">
  11. <h2 class="h-1">@Html.HtmlSanitize(Model.Heading)</h2>
  12. <p>@Html.HtmlSanitize(Model.Description)</p>
  13. @if (!string.IsNullOrEmpty(Model.ActionName))
  14. {
  15. <a class="btn" href="@Html.UrlSanitize(Model.ActionUrl)" role="button">@Model.ActionName</a>
  16. }
  17. </div>
  18. </div>
  19. </hero>
  20. }
  21. else if (string.Equals(Model.CardStyle, "button"))
  22. {
  23. <cbtn-wrapper class="@Model.CardHeight">
  24. <cbtn class="@Model.CssClass @Model.CardWidth">
  25. <a href="@Html.UrlSanitize(Model.ActionUrl)" target="@Model.CardTarget">
  26. <div>
  27. @if (!string.IsNullOrEmpty(Model.Heading))
  28. {
  29. <h-3>@Html.HtmlSanitize(Model.Heading)</h-3>
  30. }
  31. @if (!string.IsNullOrEmpty(Model.Description))
  32. {
  33. <card-text style="line-height:1.2">@Html.HtmlSanitize(Model.Description)</card-text>
  34. }
  35. </div>
  36. </a>
  37. </cbtn>
  38. </cbtn-wrapper>
  39. }
  40. else
  41. {
  42. <card-wrapper class="@Model.CardHeight">
  43. <card-base class="@Model.CssClass">
  44. @if (!string.IsNullOrEmpty(Model.ActionUrl))
  45. {
  46. <div>
  47. @if (!string.IsNullOrEmpty(Model.SelectedSizeUrl))
  48. {
  49. <a href="@Html.UrlSanitize(Model.ActionUrl)" target="@Model.CardTarget"><img loading="lazy" class="card-img-top" src="@Model.SelectedSizeUrl" title="@Model.ImageTitle" alt="@Model.ImageAlternativeText" /></a>}
  50. </div>
  51. if (!string.IsNullOrEmpty(Model.ActionName))
  52. {
  53. <card-body>
  54. <div>
  55. @if (!string.IsNullOrEmpty(Model.Heading))
  56. {<card-title>@Html.HtmlSanitize(Model.Heading)</card-title>}
  57. @if (!string.IsNullOrEmpty(Model.Description))
  58. {<card-text>@Html.HtmlSanitize(Model.Description)</card-text>}
  59. </div>
  60. @if (!string.IsNullOrEmpty(Model.ActionName))
  61. {<div><a class="btn" target="@Model.CardTarget" href="@Html.UrlSanitize(Model.ActionUrl)">@Model.ActionName </a></div>}
  62. </card-body>
  63. }
  64. else
  65. {
  66. <div>
  67. <a href="@Html.UrlSanitize(Model.ActionUrl)" target="@Model.CardTarget">
  68. <card-body>
  69. @if (!string.IsNullOrEmpty(Model.Heading))
  70. {<card-title>@Html.HtmlSanitize(Model.Heading)</card-title>}
  71. @if (!string.IsNullOrEmpty(Model.Description))
  72. {<card-text><p style="margin-top:0">@Html.HtmlSanitize(Model.Description)</p></card-text>}
  73. </card-body>
  74. </a>
  75. </div>
  76. }
  77. }
  78. else
  79. {
  80. <img loading="lazy" class="card-img-top" src="@Model.SelectedSizeUrl" title="@Model.ImageTitle" alt="@Model.ImageAlternativeText" />
  81. <card-body>
  82. @if (!string.IsNullOrEmpty(Model.Heading))
  83. {
  84. <card-title>@Html.HtmlSanitize(Model.Heading)</card-title>
  85. }
  86. @if (!string.IsNullOrEmpty(Model.Description))
  87. {
  88. <card-text>
  89. <p style="margin-top:0">@Html.HtmlSanitize(Model.Description)</p>
  90. </card-text>
  91. }
  92. </card-body>
  93. }
  94. </card-base>
  95. </card-wrapper>
  96. }