{"record":{"id":"fd5040db9912cd0e","repo":"dotnet/AspNetCore.Docs","slug":"when-calling-ko-mapping-tojs-pass-the-object-you","errorCode":null,"errorMessage":"When calling ko.mapping.toJS, pass the object you want to convert.","messagePattern":"When calling ko\\.mapping\\.toJS, pass the object you want to convert\\.","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":154,"sourceCode":"\n\texports.fromJSON = function (jsonString /*, options, target*/ ) {\n\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","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/dotnet/AspNetCore.Docs/blob/c67a80103a1a74db20784debd919c7fdda96c510/aspnetcore/mvc/controllers/testing/samples/2.x/TestingControllersSample/src/TestingControllersSample/wwwroot/js/knockout.mapping.js#L136-L172","documentation":"knockout.mapping's toJS unwraps an observable view model back to plain JS. Like fromJS, it guards on zero arguments — without a root object there is nothing to unwrap, so it throws rather than return undefined. This is the symmetric counterpart to the fromJS argument check.","triggerScenarios":"Calling ko.mapping.toJS() with no arguments; calling it after a variable that turned out to be undefined.","commonSituations":"Posting data back to server but the view-model reference was nulled; refactor that dropped the parameter; conditional flow.","solutions":["Pass the root object: ko.mapping.toJS(viewModel).","Guard the caller: if (viewModel) ko.mapping.toJS(viewModel);","Provide a fallback: ko.mapping.toJS(viewModel || {})."],"exampleFix":"// before\nconst plain = ko.mapping.toJS(); // throws\n// after\nconst plain = ko.mapping.toJS(viewModel || {});","handlingStrategy":"validation","validationCode":"// Guard toJS against a missing root object.\nfunction safeToJS(rootObject, options) {\n  if (rootObject == null) {\n    console.warn('ko.mapping.toJS called with no root; returning {}');\n    return {};\n  }\n  return ko.mapping.toJS(rootObject, options);\n}","typeGuard":"function isUnwrappable(x) { return x != null && (ko.isObservable(x) || typeof x === 'object'); }","tryCatchPattern":"try {\n  return ko.mapping.toJS(viewModel);\n} catch (e) {\n  if (/pass the object you want to convert/.test(e.message)) {\n    console.error('toJS called with no argument');\n    return {};\n  }\n  throw e;\n}","preventionTips":["Coalesce: ko.mapping.toJS(viewModel || {}).","Null-check view models after async teardown before unwrapping.","Centralize serialization in one helper that validates the root."],"tags":["knockout","knockout-mapping","validation","arguments"],"backgroundTag":null,"analyzedSha":"c67a80103a1a74db20784debd919c7fdda96c510","analyzedAt":"2026-08-13T17:46:11.763Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}