I m working on React / Next.js project using Refine package with in build tools and component, so my functionality where I have a problem that is, I m getting data from c-sharp api into my refine/next.js project's Edit page (where I'm updating users data), there is Select component where classes text value available when I m selecting that component's text (in dropdown list) the value is coming from c-sharp api (swagger api) using 'fetch' method properly but does not displayed on the select component field
ex:-
in select's text value list is = 10th, 11th, 12th
data fetch = previous value come from api (ex: 10th)
now we are selecting = 12th in dropdown list
but nothing happened (value still 10th in field)
I hope you guys understood?
code====>
`
//controller script
//service script
public async Task UpdateStudentProfile(StudentBasicDTOs stdDTOs, Guid InstituteIdforDb)
{
try
{
Students studDTO = new Students
{
Id = stdDTOs.Id,
FullName = stdDTOs.FullName,
FullNameLocal = stdDTOs.FullNameLocal,
Created = DateTime.Now,
Modified = DateTime.Now,
isDeleted = false,
Adress = new AddressBook
{
StudentId = stdDTOs.Id,
PCity = stdDTOs.PCity,
PState = stdDTOs.PState,
email2 = stdDTOs.email2,
Created = stdDTOs.Created,
Modified = stdDTOs.Modified,
isDeleted = false
},
Personal = new StudentPersonal
{
StudentId = stdDTOs.Id,
Dob = stdDTOs.Dob,
ImageProfile = stdDTOs.ImageProfile,
Created = stdDTOs.Created,
Modified = null
},
StudentCurrentAcademics = new List
{
new StudentCurrentAcademic
{
StudentId = stdDTOs.Id,
RollNoS = stdDTOs.RollNoS,
RollNoN = stdDTOs.RollNoN,
Modified = DateTime.Now
}
},
};
studDTO.StudentBatches = stdDTOs.BatchId?.Select(batchId => new StudentBatches
{
StudentId = stdDTOs.Id,
BatchId = batchId,
AyId = (Guid)stdDTOs.AyId,
Modified = DateTime.Now
}).ToList();
using (var UoW = new StudentsUoW(new Data.Context.MCMSdbContext(studDTO.InstituteId), logger))
{
// var _ayid = studDTO.StudentBatches.First().AyId;
var dd1 = UoW.StudentsRepo.getStudentBasictoEdit(studDTO.Id);
dd1.StudentBatches = studDTO.StudentBatches;
dd1.StudentCurrentAcademics = studDTO.StudentCurrentAcademics;
dd1.Personal = studDTO.Personal;
Guid tempAddressId = dd1.Adress.Id;
dd1.Adress = studDTO.Adress;
dd1.Adress.Id = tempAddressId;
dd1.ParentMob = studDTO.ParentMob;
dd1.FullName = studDTO.FullName;
dd1.FullNameLocal = studDTO.FullNameLocal;
dd1.Gender = studDTO.Gender;
dd1.GrNo = studDTO.GrNo;
dd1.StudentMob = studDTO.StudentMob;
await UoW.StudentsRepo.UpdateNewAPIAsync(dd1);
int affected = await UoW.CommitAsync();
logger.Information("Studnt Saved, Name: " + studDTO.Id + " = " + studDTO.FullName);
return true;
}
}
catch (Exception ex)
{
logger.Error($"Error updating student profile: {ex.Message}");
throw;
}
}
//repo class
public List GetBatchesIdNamebyClassId(Guid cls)
{
var reply = (from b in MCMS_Db_Context.Batches
join cb in MCMS_Db_Context.ClassesBatches on b.Id equals cb.BatchId
where cb.ClassId == cls
select new BatchesIdNameOnlyDTO { Batch=b.Batch, Id=b.Id}
).ToList();
return reply;
}
// we are using just becoz we need this value for updating but using class name that's why we are using 'cid' param in refin/next.js project api path
`
// refine/next.js script where we are display the fetched vlaue
// src/app/students/edit/[id]/page.tsx
"use client"
import React from "react";
import { Edit, useForm, useSelect } from "@refinedev/antd";
import { Form, Input, InputNumber, Switch, DatePicker, Select } from "antd";
import { useParams } from "next/navigation";
import dayjs from "dayjs";
import { batchConfig } from "@providers/resources/batch";
// 🌟 Hardcoded Options
const CATEGORY_OPTIONS = ["Open", "Sc", "ST", "NT", "VjNT", "OBC"]
.map(val => ({ label: val, value: val }));
const RELIGION_OPTIONS = ["Hindu", "Muslim", "Islam", "Christian", "Sikh", "Buddhist", "Jain", "Parsi"]
.map(val => ({ label: val, value: val }));
const RELIGION_MARATHI_OPTIONS = ["हिंदू", "मुस्लिम", "इस्लाम", "इसाई", "सिख", "बौद्ध", "जैन", "पारसी"]
.map(val => ({ label: val, value: val }));
const GENDER_OPTIONS = ["Male", "Female"]
.map(val => ({ label: val, value: val }));
const BLOOD_OPTIONS = ["A", "A+", "B", "B+", "AB", "AB+", "O", "O+"]
.map(val => ({ label: val, value: val }));
export default function StudentEdit() {
const { id } = useParams();
// 1. Fetch the existing student data
const { formProps, saveButtonProps, query, formLoading } = useForm({
resource: "students",
id: id as string,
action: "edit",
queryOptions: {
select: (queryResult) => {
const data = queryResult.data;
// 🌟 Convert raw date strings into dayjs objects so the DatePickers don't crash
return {
data: {
...data,
dob: data.dob ? dayjs(data.dob) : null,
admissionDates: data.admissionDates ? dayjs(data.admissionDates) : null,
admissionDate: data.admissionDate ? dayjs(data.admissionDate) : null,
classId : data.classId
}
}
}
}
});
const oldData = query?.data?.data
console.log(oldData)
// 2. Watch the selected class ID (This will auto-populate when the edit form loads!)
const selectedClassId = Form.useWatch("classId", formProps.form);
// 3. Fetch Classes Dropdown
const { selectProps: classSelectProps } = useSelect({
resource: "class",
optionLabel: "class",
optionValue: "id",
defaultValue:oldData?.classId
});
// 4. Fetch Batches dynamically based on the current classId
const { selectProps: batchSelectProps } = useSelect({
resource: "batch",
optionLabel: "title",
optionValue: "id",
queryOptions: {
enabled: !!selectedClassId,
// 🚨 THE FIX: Force Refine to bust the cache every time the Class changes!
queryKey: ["batch", "list", "cascading", selectedClassId],
},
meta: {
customEndpoint: selectedClassId
? `${batchConfig.batchIdNameList}?cid=${selectedClassId}`
: batchConfig.batchIdNameList
}
});
return (
);
}
//api fetch
// src/providers/dProviders.ts
import { DataProvider } from "@refinedev/core";
import { v4 as uuidv4 } from "uuid";
import { CONFIG } from "./baseConfig";
import { RESOURCE_MAP } from "./resources"; // This automatically loads the index.ts file!
const formatResourceName = (resource: string) => resource.charAt(0).toUpperCase() + resource.slice(1);
const getResourceConfig = (resource: string) => {
const config = RESOURCE_MAP[resource.toLowerCase()];
if (!config) throw new Error(`Resource '${resource}' is not configured in RESOURCE_MAP.`);
return config;
};
const buildHeaders = (requireAyId: boolean = false) => {
const headers: Record ={
...CONFIG.DEFAULT_FETCH_OPTIONS.headers
};
if(requireAyId) headers["AYId"] = CONFIG.AY_ID;
return headers;
}
// API Handler
const handleApiResponse = async (response: Response, actionName: string, fallbackId: string | number) => {
if (!response.ok) {
const errorText = await response.text();
console.error(`C# API ERROR [${actionName}]:`, errorText);
throw new Error(`Failed to ${actionName}. Status: ${response.status}`);
}
const contentType = response.headers.get("content-type");
if (contentType && contentType.includes("application/json")) {
return await response.json();
}
const responseText = await response.text();
return { id: fallbackId, message: responseText };
};
// ============================================================================
// 🚀 MAIN DATA PROVIDER EXPORT
// ============================================================================
export const dataProvider = (url: string): DataProvider => ({
getOne: async ({ resource, id, meta }) => {
const apiResource = formatResourceName(resource);
const route = getResourceConfig(resource); // Look up endpoints
const response = await fetch(`${url}/${apiResource}/${route.getOne}?${route.idParam}=${id}`, {
method: "GET",
...CONFIG.DEFAULT_FETCH_OPTIONS,
signal: meta?.signal
});
if (!response.ok) throw new Error(`Failed to fetch ${resource}. Status: ${response.status}`);
const data = await response.json();
console.log(`[DEBUG] getOne Data for ${resource}:`, data);
// Dynamically map DB field to UI title based on resource type
return { data: route.mapUI(data) };
},
update: async ({ resource, id, variables }) => {
const apiResource = formatResourceName(resource);
const route = getResourceConfig(resource);
const formData = variables as Record;
const payload = route.builder(id as string, formData, true);
const response = await fetch(`${url}/${apiResource}/${route.update}`, {
method: "PUT",
...CONFIG.DEFAULT_FETCH_OPTIONS,
body: JSON.stringify(payload)
});
const data = await handleApiResponse(response, `update ${resource}`, id);
return { data };
},
getApiUrl: () => url,
});
this above api controller script