{"record":{"id":"06d987d1fde710f2","repo":"dotnet/AspNetCore.Docs","slug":"ko-mapping-defaultoptions-include-should-be-an-a","errorCode":null,"errorMessage":"ko.mapping.defaultOptions().include should be an array.","messagePattern":"ko\\.mapping\\.defaultOptions\\(\\)\\.include should be an array\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"aspnetcore/mvc/controllers/testing/samples/2.x/TestingControllersSample/src/TestingControllersSample/wwwroot/js/knockout.mapping.js","lineNumber":156,"sourceCode":"\t\tvar parsed = ko.utils.parseJson(jsonString);\n\t\targuments[0] = parsed;\n\t\treturn exports.fromJS.apply(this, arguments);\n\t};\n\n\texports.updateFromJS = function (viewModel) {\n\t\tthrow new Error(\"ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!\");\n\t};\n\n\texports.updateFromJSON = function (viewModel) {\n\t\tthrow new Error(\"ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!\");\n\t};\n\n\texports.toJS = function (rootObject, options) {\n\t\tif (!defaultOptions) exports.resetDefaultOptions();\n\n\t\tif (arguments.length == 0) throw new Error(\"When calling ko.mapping.toJS, pass the object you want to convert.\");\n\t\tif (exports.getType(defaultOptions.ignore) !== \"array\") throw new Error(\"ko.mapping.defaultOptions().ignore should be an array.\");\n\t\tif (exports.getType(defaultOptions.include) !== \"array\") throw new Error(\"ko.mapping.defaultOptions().include should be an array.\");\n\t\tif (exports.getType(defaultOptions.copy) !== \"array\") throw new Error(\"ko.mapping.defaultOptions().copy should be an array.\");\n\n\t\t// Merge in the options used in fromJS\n\t\toptions = fillOptions(options, rootObject[mappingProperty]);\n\n\t\t// We just unwrap everything at every level in the object graph\n\t\treturn exports.visitModel(rootObject, function (x) {\n\t\t\treturn ko.utils.unwrapObservable(x)\n\t\t}, options);\n\t};\n\n\texports.toJSON = function (rootObject, options) {\n\t\tvar plainJavaScriptObject = exports.toJS(rootObject, options);\n\t\treturn ko.utils.stringifyJson(plainJavaScriptObject);\n\t};\n\n\texports.defaultOptions = function () {\n\t\tif (arguments.length > 0) {","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/dotnet/AspNetCore.Docs/blob/c67a80103a1a74db20784debd919c7fdda96c510/aspnetcore/mvc/controllers/testing/samples/2.x/TestingControllersSample/src/TestingControllersSample/wwwroot/js/knockout.mapping.js#L138-L174","documentation":"Symmetric to the ignore check: toJS validates defaultOptions().include is an array. `include` forces normally-hidden mapped properties to be emitted; a non-array value would corrupt traversal, so the library rejects it up front.","triggerScenarios":"ko.mapping.defaultOptions().include = 'computedField'; (string) instead of ['computedField']; null/number assignment.","commonSituations":"Same as the ignore case — misconfigured default options, dynamic construction dropping the array wrapper.","solutions":["Set include as an array: ko.mapping.defaultOptions().include = ['computedField'];","Audit all three list options (ignore, include, copy) together since they share the same shape requirement."],"exampleFix":"// before\nko.mapping.defaultOptions().include = 'fullName';\n// after\nko.mapping.defaultOptions().include = ['fullName'];","handlingStrategy":"validation","validationCode":"function setIncludeList(keys) {\n  if (!Array.isArray(keys)) {\n    throw new TypeError('include list must be an array');\n  }\n  ko.mapping.defaultOptions().include = keys;\n}","typeGuard":"function isStringArray(x) { return Array.isArray(x) && x.every(function (k) { return typeof k === 'string'; }); }","tryCatchPattern":"try {\n  ko.mapping.toJS(viewModel);\n} catch (e) {\n  if (/include should be an array/.test(e.message)) {\n    ko.mapping.defaultOptions().include = [];\n  } else { throw e; }\n}","preventionTips":["Wrap defaultOptions() mutations in a helper that enforces arrays.","Set include, ignore, and copy together in one config block.","Add a unit test that calls toJS after configuring defaults."],"tags":["knockout","knockout-mapping","configuration","validation"],"backgroundTag":null,"analyzedSha":"c67a80103a1a74db20784debd919c7fdda96c510","analyzedAt":"2026-08-13T17:46:11.763Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}