using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Binders; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.PublishedContent; namespace Umbraco.Cms.Web.Common.ModelBinders; /// /// The provider for mapping view models, supporting mapping to and from any /// IPublishedContent or IContentModel. /// public class ContentModelBinderProvider : IModelBinderProvider { public IModelBinder? GetBinder(ModelBinderProviderContext context) { Type modelType = context.Metadata.ModelType; // Can bind to ContentModel (exact type match) // or to ContentModel (exact generic type match) // or to TContent where TContent : IPublishedContent (any IPublishedContent implementation) if (modelType == typeof(ContentModel) || (modelType.IsGenericType && modelType.GetGenericTypeDefinition() == typeof(ContentModel<>)) || typeof(IPublishedContent).IsAssignableFrom(modelType)) { return new BinderTypeModelBinder(typeof(ContentModelBinder)); } return null; } }