OrchardCMS/OrchardCore · error · ArgumentException

The type must implement IContentFieldDisplayDriver

Error message

The type must implement IContentFieldDisplayDriver

What it means

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.

Solutions

  1. Pass the driver class that implements IContentFieldDisplayDriver
  2. If the driver is a part driver, use ForContentPartDisplayMode instead
  3. Check the driver's base class / implemented interfaces before registering

Example fix

// before
options.ForContentFieldDisplayMode(typeof(TextField), typeof(ProductPartDisplayDriver), d => d == "Detail");
// after
options.ForContentFieldDisplayMode(typeof(TextField), typeof(TextFieldDisplayDriver), d => d == "Detail");
Defensive patterns

Strategy: type-guard

Validate before calling

if (!typeof(IContentFieldDisplayDriver).IsAssignableFrom(driverType))
    throw new ArgumentException($"{driverType.Name} is not an IContentFieldDisplayDriver.");

Type guard

static bool IsFieldDisplayDriver(Type t) => typeof(IContentFieldDisplayDriver).IsAssignableFrom(t);

Try / catch

try
{
    options.ForContentFieldDisplayMode(fieldType, driverType, predicate);
}
catch (ArgumentException ex) when (ex.Message.Contains(nameof(IContentFieldDisplayDriver)))
{
    _logger.LogError(ex, "{Type} is not an IContentFieldDisplayDriver", driverType.Name);
}

Prevention

When it happens

Trigger: Calling ForContentFieldDisplayMode(fieldType, driverType, predicate) with a ContentPartDisplayDriver or other non-field driver type

Common situations: 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

Understand the failure class

Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.

Related errors


AI-assisted analysis of OrchardCMS/OrchardCore@4306c0717f (2026-09-13). Data as JSON: /api/errors/8d0b777d4d375028. Report an issue: GitHub.

Appendix: source

Thrown at src/OrchardCore/OrchardCore.ContentManagement.Display/ContentDisplay/ContentDisplayOptions.cs:73

        {
            throw new ArgumentException("The type must inherit from " + nameof(ContentPart));
        }

        var option = _contentParts.FirstOrDefault(x => x.Type == contentPartType);
        if (option == null)
        {
            option = new ContentPartDisplayOption(contentPartType);
            _contentParts.Add(option);
        }

        return option;
    }

    internal void ForContentFieldDisplayMode(Type contentFieldType, Type displayModeDriverType, Func<string, bool> predicate)
    {
        if (!typeof(IContentFieldDisplayDriver).IsAssignableFrom(displayModeDriverType))
        {
            throw new ArgumentException("The type must implement " + nameof(IContentFieldDisplayDriver));
        }

        var option = GetOrAddContentFieldDisplayOption(contentFieldType);
        option.ForDisplayMode(displayModeDriverType, predicate);
    }

    internal void ForContentFieldEditor(Type contentFieldType, Type editorDriverType, Func<string, bool> predicate)
    {
        if (!typeof(IContentFieldDisplayDriver).IsAssignableFrom(editorDriverType))
        {
            throw new ArgumentException("The type must implement " + nameof(IContentFieldDisplayDriver));
        }

        var option = GetOrAddContentFieldDisplayOption(contentFieldType);
        option.ForEditor(editorDriverType, predicate);
    }

    internal void RemoveContentFieldDisplayDriver(Type contentPartType, Type driverType)

View on GitHub (pinned to 4306c0717f)