mvcdonutcaching icon indicating copy to clipboard operation
mvcdonutcaching copied to clipboard

Serialization error when trying to pass model object to child action using action method extension of Donutcache

Open codeworm47 opened this issue 8 years ago • 1 comments

I'm passing a model object to Action method extension which recessives an extra parameter (excludeFromParentCache) to determine whether child action should be exclude from cache but I get this error

Type 'ECS.Infrastructure.ViewModels.ProductModel.ProductRichSnippetViewModel' with data contract name 'ProductRichSnippetViewModel:http://schemas.datacontract.org/2004/07/ECS.Infrastructure.ViewModels.ProductModel' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer'

here is my code in my view @section RichSnippetJson{ @{ var productRichSnippet = new ECS.Infrastructure.ViewModels.ProductModel.ProductRichSnippetViewModel() { HasActiveSize = Model.Config != null && Model.Config.ProductSizes != null && Model.Config.ProductSizes.Any(p => p.Enabled), ImageUrl = Model.Config != null && Model.Config.ProductImages != null && Model.Config.ProductImages.Any() ? Model.Config.ProductImages.First() : "", ProductId = Model.ProductId, Url = Model.Config != null ? Url.ProductUrl(Model.ProductId, Model.Config.FaTitle) : ECS.Facade.FacadeInterface.Facade.GetAppConfigValue("Seo-Title-Site"), Availibility = (int)Model.Status, AlternateTitle = Model.Config != null ? Model.Config.EnTitle : "", Title = Model.Config != null ? Model.Config.FaTitle : "", BrandFaTitle = Model.Brand.FaTitle, Price = Model.Config != null && Model.Config.PriceInfo != null ? Model.Config.PriceInfo.Discount > 0 ? Model.Config.PriceInfo.DisplayPrice.Replace(",", "") : Model.Config.PriceInfo.PayableAmount.Replace(",", "") : "0", Description = Model.PageDescription }; } @Html.Action("GetRichSnippet", "Product", new { model = productRichSnippet },true) }

Do note that it's ok if I call default action method of mvc, so I think there must be a bug in Donutcache 2017-06-24_14-38-51

codeworm47 avatar Jun 24 '17 10:06 codeworm47

Came across this issue myself. Assuming your model is something you know is serializable you can let the serializer know to expect it by adding the following to your web.config

<system.runtime.serialization>
    <dataContractSerializer>
        <declaredTypes>
            <add type="DevTrends.MvcDonutCaching.ActionSettings, DevTrends.MvcDonutCaching">
                <knownType type="ECS.Infrastructure.ViewModels.ProductModel.ProductRichSnippetViewModel, ECS.Infrastructure" />
            </add>
        </declaredTypes>
    </dataContractSerializer>
</system.runtime.serialization>

Where the knownType tag should be the fully qualified type name you want the serialize to know about.

mattbrailsford avatar Feb 21 '20 13:02 mattbrailsford