{"record":{"id":"333d9f2a99463594","repo":"nopSolutions/nopCommerce","slug":"no-specification-attribute-group-found-with-the-sp","errorCode":null,"errorMessage":"No specification attribute group found with the specified id","messagePattern":"No specification attribute group found with the specified id","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Presentation/Nop.Web/Areas/Admin/Controllers/SpecificationAttributeController.cs","lineNumber":126,"sourceCode":"    [HttpPost]\n    [CheckPermission(StandardPermission.Catalog.SPECIFICATION_ATTRIBUTES_VIEW)]\n    public virtual async Task<IActionResult> SpecificationAttributeGroupList(SpecificationAttributeSearchModel searchModel)\n    {\n        var model = await _specificationAttributeModelFactory.PrepareSpecificationAttributeGroupListModelAsync(searchModel);\n\n        return Json(model);\n    }\n\n    [HttpPost]\n    [CheckPermission(StandardPermission.Catalog.SPECIFICATION_ATTRIBUTES_VIEW)]\n    public virtual async Task<IActionResult> SpecificationAttributeList(SpecificationAttributeSearchModel searchModel)\n    {\n        SpecificationAttributeGroup group = null;\n\n        if (searchModel.SpecificationAttributeGroupId > 0)\n        {\n            group = await _specificationAttributeService.GetSpecificationAttributeGroupByIdAsync(searchModel.SpecificationAttributeGroupId)\n                ?? throw new ArgumentException(\"No specification attribute group found with the specified id\");\n        }\n\n        var model = await _specificationAttributeModelFactory.PrepareSpecificationAttributeListModelAsync(searchModel, group);\n\n        return Json(model);\n    }\n\n    [CheckPermission(StandardPermission.Catalog.SPECIFICATION_ATTRIBUTES_CREATE_EDIT_DELETE)]\n    public virtual async Task<IActionResult> CreateSpecificationAttributeGroup()\n    {\n        var model = await _specificationAttributeModelFactory.PrepareSpecificationAttributeGroupModelAsync(new SpecificationAttributeGroupModel(), null);\n\n        return View(model);\n    }\n\n    [HttpPost, ParameterBasedOnFormName(\"save-continue\", \"continueEditing\")]\n    [CheckPermission(StandardPermission.Catalog.SPECIFICATION_ATTRIBUTES_CREATE_EDIT_DELETE)]\n    public virtual async Task<IActionResult> CreateSpecificationAttributeGroup(SpecificationAttributeGroupModel model, bool continueEditing)","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/nopSolutions/nopCommerce/blob/64bdf2ff08c8b39e65717bcf974fb43dc2ef68f2/src/Presentation/Nop.Web/Areas/Admin/Controllers/SpecificationAttributeController.cs#L108-L144","documentation":"Thrown by SpecificationAttributeController.SpecificationAttributeList when the search model's SpecificationAttributeGroupId is greater than zero but GetSpecificationAttributeGroupByIdAsync returns null. This AJAX grid endpoint lists specification attributes, optionally scoped to a group; a missing group is treated as an invalid request and aborted with ArgumentException. The guard only fires when a group id is actually supplied (id <= 0 means 'all groups').","triggerScenarios":"The specification-attributes grid is filtered by a group that was deleted in another session between the filter dropdown load and the grid data request. Also triggered by a hand-crafted POST with a stale group id, or by navigating back to a cached page whose filter references a removed group.","commonSituations":"An admin deletes a specification attribute group in one tab, then returns to another tab whose attribute list is still filtered to that group and triggers a rebind/reload. A plugin modifies group ids during import/migration, invalidating cached grid URLs.","solutions":["Clear the specification-attribute-group filter or reload the page so the dropdown no longer references the deleted group.","Verify the group still exists in the specification attribute groups list; if not, the filter is stale and the error is expected.","For custom integrations, check the group id against the current groups before posting the search model, and fall back to an unfiltered list if it is gone.","Wrap the action in a try-catch returning a localized empty-grid result instead of a 500."],"exampleFix":"// before\ngroup = await _specificationAttributeService.GetSpecificationAttributeGroupByIdAsync(searchModel.SpecificationAttributeGroupId)\n    ?? throw new ArgumentException(\"No specification attribute group found with the specified id\");\n\n// after\ngroup = await _specificationAttributeService.GetSpecificationAttributeGroupByIdAsync(searchModel.SpecificationAttributeGroupId);\nif (group is null)\n    searchModel.SpecificationAttributeGroupId = 0; // fall back to unfiltered","handlingStrategy":"validation","validationCode":"if (searchModel.SpecificationAttributeGroupId > 0)\n{\n    var group = await _specificationAttributeService\n        .GetSpecificationAttributeGroupByIdAsync(searchModel.SpecificationAttributeGroupId);\n    if (group is null)\n        searchModel.SpecificationAttributeGroupId = 0; // unscoped fallback\n}","typeGuard":null,"tryCatchPattern":"try { await controller.SpecificationAttributeList(searchModel); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"No specification attribute group\"))\n{ /* stale group filter — clear filter and retry unscoped */ }","preventionTips":["After deleting a specification attribute group, invalidate cached grid filters that reference it.","Provide an 'all groups' fallback when a selected group no longer exists.","Reload the filter dropdown before binding the grid."],"tags":["nopcommerce","admin-controller","not-found","specification-attribute","argument-exception"],"backgroundTag":null,"analyzedSha":"64bdf2ff08c8b39e65717bcf974fb43dc2ef68f2","analyzedAt":"2026-08-13T21:19:38.062Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}