{"record":{"id":"ecb3be0efb2e3b06","repo":"OrchardCMS/OrchardCore","slug":"content-field-name-contains-invalid-characters","errorCode":null,"errorMessage":"Content field name contains invalid characters","messagePattern":"Content field name contains invalid characters","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.ContentManagement.Abstractions/Metadata/Builders/ContentPartDefinitionBuilder.cs","lineNumber":233,"sourceCode":"        private readonly string _fieldName;\n\n        public FieldConfigurerImpl(ContentPartFieldDefinition field, ContentPartDefinition part)\n            : base(field)\n        {\n            _fieldDefinition = field.FieldDefinition;\n            _fieldName = field.Name;\n            _partDefinition = part;\n        }\n\n        public override ContentPartFieldDefinition Build()\n        {\n            if (!char.IsLetter(_fieldName[0]))\n            {\n                throw new ArgumentException(\"Content field name must start with a letter\", \"name\");\n            }\n            if (!string.Equals(_fieldName, _fieldName.ToSafeName(), StringComparison.OrdinalIgnoreCase))\n            {\n                throw new ArgumentException(\"Content field name contains invalid characters\", \"name\");\n            }\n\n            return new ContentPartFieldDefinition(_fieldDefinition, _fieldName, _settings);\n        }\n\n        public override string Name\n            => _fieldName;\n\n        public override string FieldType\n            => _fieldDefinition.Name;\n\n\n        public override string PartName\n            => _partDefinition.Name;\n\n        public override ContentPartFieldDefinitionBuilder OfType(ContentFieldDefinition fieldDefinition)\n        {\n            _fieldDefinition = fieldDefinition;","sourceCodeStart":215,"sourceCodeEnd":251,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.ContentManagement.Abstractions/Metadata/Builders/ContentPartDefinitionBuilder.cs#L215-L251","documentation":"ContentPartDefinitionBuilder's field builder Build throws ArgumentException when the field name differs from its ToSafeName() form (case-insensitive), i.e. it contains characters disallowed in safe names.","triggerScenarios":"WithField(\"Sales Amount\", ...) or names with dashes/dots/symbols, then the field Build(); field names taken from external sources without sanitization.","commonSituations":"Field names with spaces from form input, hyphenated names from external schemas, accented characters in names.","solutions":["Sanitize with ToSafeName() before WithField(): builder.WithField(raw.ToSafeName(), ...).","Strip invalid characters (keep letters/digits, first char a letter) before building.","Validate field names in any custom admin/import UI."],"exampleFix":"// before\npartBuilder.WithField(\"Sales Amount\", f => f.OfType<NumericField>()); // throws\n\n// after\npartBuilder.WithField(\"Sales Amount\".ToSafeName(), f => f.OfType<NumericField>()); // \"SalesAmount\"","handlingStrategy":"validation","validationCode":"string safe = rawFieldName.ToSafeName();\nbool ok = string.Equals(rawFieldName, safe, StringComparison.OrdinalIgnoreCase);","typeGuard":null,"tryCatchPattern":"try\n{\n    var fieldDef = fieldBuilder.Build();\n}\ncatch (ArgumentException e)\n{\n    _logger.LogError(e, \"Field name '{Name}' contains invalid characters\", rawFieldName);\n}","preventionTips":["Apply ToSafeName() to field names from user input or imports.","Keep display names separate from technical field names.","Validate names in custom admin forms before persisting."],"tags":["naming","content-field","validation"],"backgroundTag":"invalid-identifier-format","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"}