{"record":{"id":"8d0b777d4d375028","repo":"OrchardCMS/OrchardCore","slug":"the-type-must-implement-icontentfielddisplaydriver","errorCode":null,"errorMessage":"The type must implement IContentFieldDisplayDriver","messagePattern":"The type must implement IContentFieldDisplayDriver","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.ContentManagement.Display/ContentDisplay/ContentDisplayOptions.cs","lineNumber":73,"sourceCode":"        {\n            throw new ArgumentException(\"The type must inherit from \" + nameof(ContentPart));\n        }\n\n        var option = _contentParts.FirstOrDefault(x => x.Type == contentPartType);\n        if (option == null)\n        {\n            option = new ContentPartDisplayOption(contentPartType);\n            _contentParts.Add(option);\n        }\n\n        return option;\n    }\n\n    internal void ForContentFieldDisplayMode(Type contentFieldType, Type displayModeDriverType, Func<string, bool> predicate)\n    {\n        if (!typeof(IContentFieldDisplayDriver).IsAssignableFrom(displayModeDriverType))\n        {\n            throw new ArgumentException(\"The type must implement \" + nameof(IContentFieldDisplayDriver));\n        }\n\n        var option = GetOrAddContentFieldDisplayOption(contentFieldType);\n        option.ForDisplayMode(displayModeDriverType, predicate);\n    }\n\n    internal void ForContentFieldEditor(Type contentFieldType, Type editorDriverType, Func<string, bool> predicate)\n    {\n        if (!typeof(IContentFieldDisplayDriver).IsAssignableFrom(editorDriverType))\n        {\n            throw new ArgumentException(\"The type must implement \" + nameof(IContentFieldDisplayDriver));\n        }\n\n        var option = GetOrAddContentFieldDisplayOption(contentFieldType);\n        option.ForEditor(editorDriverType, predicate);\n    }\n\n    internal void RemoveContentFieldDisplayDriver(Type contentPartType, Type driverType)","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.ContentManagement.Display/ContentDisplay/ContentDisplayOptions.cs#L55-L91","documentation":"ContentDisplayOptions.ForContentFieldDisplayMode registers a display-mode driver for a content field and requires the driver type to implement IContentFieldDisplayDriver. Field display modes are driven exclusively by field display drivers, so passing any other driver kind is rejected.","triggerScenarios":"Calling ForContentFieldDisplayMode(fieldType, driverType, predicate) with a ContentPartDisplayDriver or other non-field driver type","commonSituations":"Copy-pasted part registration code adapted to a field where only the part type was changed; refactored driver that changed base class from field to part driver","solutions":["Pass the driver class that implements IContentFieldDisplayDriver","If the driver is a part driver, use ForContentPartDisplayMode instead","Check the driver's base class / implemented interfaces before registering"],"exampleFix":"// before\noptions.ForContentFieldDisplayMode(typeof(TextField), typeof(ProductPartDisplayDriver), d => d == \"Detail\");\n// after\noptions.ForContentFieldDisplayMode(typeof(TextField), typeof(TextFieldDisplayDriver), d => d == \"Detail\");","handlingStrategy":"type-guard","validationCode":"if (!typeof(IContentFieldDisplayDriver).IsAssignableFrom(driverType))\n    throw new ArgumentException($\"{driverType.Name} is not an IContentFieldDisplayDriver.\");","typeGuard":"static bool IsFieldDisplayDriver(Type t) => typeof(IContentFieldDisplayDriver).IsAssignableFrom(t);","tryCatchPattern":"try\n{\n    options.ForContentFieldDisplayMode(fieldType, driverType, predicate);\n}\ncatch (ArgumentException ex) when (ex.Message.Contains(nameof(IContentFieldDisplayDriver)))\n{\n    _logger.LogError(ex, \"{Type} is not an IContentFieldDisplayDriver\", driverType.Name);\n}","preventionTips":["Confirm the driver derives from ContentFieldDisplayDriver before field-mode registration","When adapting part placement code to fields, change both the type AND the driver, not just the type","Prefer generic/typed registration helpers that encode the driver kind in the signature"],"tags":["display-management","drivers","type-validation","content-field"],"backgroundTag":"type-mismatch","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}