{"record":{"id":"d5420b8a16163727","repo":"marmelab/react-admin","slug":"usenextprevcontroller-was-called-outside-of-a-reso","errorCode":null,"errorMessage":"useNextPrevController was called outside of a ResourceContext and without a resource prop. You must set the resource prop.","messagePattern":"useNextPrevController was called outside of a ResourceContext and without a resource prop\\. You must set the resource prop\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/ra-core/src/controller/usePrevNextController.ts","lineNumber":128,"sourceCode":"): UsePrevNextControllerResult => {\n    const {\n        linkType = 'edit',\n        storeKey,\n        limit = 1000,\n        sort: initialSort = { field: 'id', order: SORT_ASC },\n        filter: permanentFilter = {},\n        filterDefaultValues = {},\n        queryOptions = {\n            staleTime: 5 * 60 * 1000,\n        },\n    } = props;\n\n    const record = useRecordContext<RecordType>(props);\n    const resource = useResourceContext(props);\n    const createPath = useCreatePath();\n\n    if (!resource) {\n        throw new Error(\n            `useNextPrevController was called outside of a ResourceContext and without a resource prop. You must set the resource prop.`\n        );\n    }\n\n    const [storedParams] = useStore<ListParams>(\n        storeKey || `${resource}.listParams`,\n        {\n            filter: filterDefaultValues,\n            order: initialSort.order,\n            sort: initialSort.field,\n            page: 1,\n            perPage: 10,\n            displayedFilters: {},\n        }\n    );\n\n    const dataProvider = useDataProvider();\n    const queryClient = useQueryClient();","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/marmelab/react-admin/blob/051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0/packages/ra-core/src/controller/usePrevNextController.ts#L110-L146","documentation":"useNextPrevController (used by NextPrevPageButtons / NavigationLink) determines the current resource to read the list params from the store. It resolves the resource from ResourceContext or the resource prop; when both are absent it throws.","triggerScenarios":"Rendering <NextPrevPageButtons> (or calling usePrevNextController) outside a <Resource>/ListContext and without passing resource=\"posts\"; using it in a component mounted before the ResourceContext provider.","commonSituations":"Adding navigation buttons to a custom page outside the react-admin layout; copy-pasting the component into a storybook story; forgetting the resource prop on a component nested under a non-Resource route.","solutions":["Pass the resource prop explicitly: <NextPrevPageButtons resource=\"posts\" />","Render the component inside the resource's context (inside a List/Show/Edit view or under <Resource>)"],"exampleFix":"// before\n<NextPrevPageButtons /> // outside ResourceContext\n// after\n<NextPrevPageButtons resource=\"posts\" />","handlingStrategy":"validation","validationCode":"if (!resource) throw new Error('NextPrevPageButtons requires resource or ResourceContext');","typeGuard":"const hasResource = (p: { resource?: string }): p is { resource: string } => typeof p.resource === 'string' && p.resource.length > 0;","tryCatchPattern":"null","preventionTips":["Pass resource explicitly when used outside list/show/edit views","Keep such components inside react-admin's layout/context tree","Check the hook docs for context requirements before custom mounting"],"tags":["react-admin","missing-prop","context"],"backgroundTag":"missing-required-prop","analyzedSha":"051f511bb0afb5ea565c2d3728bf4dab0a6fa5e0","analyzedAt":"2026-08-30T02:28:14.926Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}