These are my code samples
**Controller
** public async Task<IActionResult> Get([FromForm] BuyInsuranceDTO b)
{
//if (!User.HasClaim("Permission", Permissions.PurchasePolicy))
//{
// return StatusCode(403, new
// {
// success = false,
// message = "Sorry, you cant purchase policy at the moment."
// });
//}
var loggedInCustomer = Convert.ToInt16(User.FindFirst(ClaimTypes.NameIdentifier)?.Value);
var upload = Request.Form.Files.Where(x => x.Name == "Identification").FirstOrDefault();
var createPolicy = await service.CreateService(b, upload, loggedInCustomer, User.Identity.IsAuthenticated);
if (!createPolicy.Success)
{
return Json(new MyResponse { Success = false, Message = createPolicy.Message });
}
return Json(new MyResponse { Success = true, Message = createPolicy.Message });
}**
DTO
public class BuyInsuranceDTO**
**{**
**// ================= BASIC =================**
**[Required]**
**public string FirstName { get; set; }**
**[Required]**
**public string LastName { get; set; }**
**public string MiddleName { get; set; }**
**[Required]**
**[Range(1, 2)]**
**public int Sex { get; set; }**
**[Required]**
**public DateTime DOB { get; set; }**
**[Required]**
**public string PhoneNumber { get; set; }**
**[Required]**
**public string Address { get; set; }**
**public string EmailAddress { get; set; }**
**public string Agent { get; set; }**
**// ================= NEXT OF KIN =================**
**[Required]**
**public string NOKFullName { get; set; }**
**public int NOKRelationship { get; set; }**
**[Required]**
**public string NOKPhoneNumber { get; set; }**
**[Required]**
**public string NOKAddress { get; set; }**
**// ================= POLICY =================**
**public Guid? PolicyID { get; set; }**
**[Required]**
**public List<CoverItemDTO> Covers { get; set; }**
**// ================= IDENTIFICATION =================**
**[Required]**
**public int IdentificationTypeId { get; set; }**
**[Required]**
**public string IdentificationNumber { get; set; }**
**public DateTime? ExpiryDate { get; set; }**
**public IFormFile Identification { get; set; }**
**// ================= BUSSINESS ADDRESS =================**
**public string StreetNumber { get; set; }**
**[Required]**
**public string StreetName { get; set; }**
**public string LandMark { get; set; }**
**[Required]**
**public int StateID { get; set; }**
**[Required]**
**public int LGAID { get; set; }**
**[Required]**
**public int AccountID { get; set; }**
**// ================= COVER UPLOADS =================**
**public List<CoverFileUploadDTO> CoverFiles { get; set; }**
**//============ Declared Items=================**
**public List<DeclarationItemsDTO> DeclarationItems { get; set; }**
**}**
Java Script
async function handleFinalSubmission() {
**if (!confirm('Are you sure you want to submit this policy application?')) {**
**return;**
**}**
**const formData = buildPolicyFormData();**
**const result = await sendPolicy(formData);**
**if (!result) {**
**return;**
**}**
**alert(result.message);**
**if (result.success) {**
**window.location.href =**
**'/policylisting/insuranceproduct';**
**}**
}
async function sendPolicy(formData) {
**if (isSubmitting) return;**
**isSubmitting = true;**
**showLoader();**
**try {**
**const res = await fetch(`/policyListing/get`, {**
**method: 'POST',**
**body: formData**
**});**
**const data = await res.json();**
**return data;**
**} catch (err) {**
**console.error(err);**
**alert("Failed to submit policy");**
**return null;**
**} finally {**
**isSubmitting = false;**
**hideLoader();**
**}**
}
function appendIfExists(formData, key, elementId) {
const el = document.getElementById(elementId);
if (el)
formData.append(key, el.value.trim());
}
function buildPolicyFormData() {
const formData = new FormData();
appendIfExists(formData, "FirstName", "firstName");
appendIfExists(formData, "MiddleName", "middleName");
appendIfExists(formData, "LastName", "lastName");
appendIfExists(formData, "PhoneNumber", "phone");
appendIfExists(formData, "Sex", "sex");
appendIfExists(formData, "DOB", "dob");
appendIfExists(formData, "Agent", "agent");
appendIfExists(formData, "Address", "address");
appendIfExists(formData, "EmailAddress", "email");
appendIfExists(formData, "NOKFullName", "nokName");
appendIfExists(formData, "NOKRelationship", "nokRelationship");
appendIfExists(formData, "NOKPhoneNumber", "nokPhone");
appendIfExists(formData, "NOKAddress", "nokAddress");
appendIfExists(formData, "IdentificationTypeId", "idType");
appendIfExists(formData, "IdentificationNumber", "idNumber");
appendIfExists(formData, "ExpiryDate", "expiryDate");
appendIfExists(formData, "StateID", "businessState");
appendIfExists(formData, "LGAID", "businessLga");
appendIfExists(formData, "StreetNumber", "businessStreetNumber");
appendIfExists(formData, "StreetName", "businessAddress");
appendIfExists(formData, "LandMark", "businessLandmark");
const idFile = document.getElementById('idUpload')?.files[0];
if (idFile) formData.append("Identification", idFile);
if (policyId) {
formData.append("PolicyID", policyId);
}
// Covers
if (isCustomPolicy && selectedCovers.length > 0) {
selectedCovers.forEach((cover, i) => {
formData.append(`Covers[${i}].CoverID`, cover.CoverID);
formData.append(`Covers[${i}].RiskCovered`, coverRisks[cover.CoverID] || 0);
});
} else if (selectedCoverIds.length > 0) {
selectedCoverIds.forEach((id, i) => {
formData.append(`Covers[${i}].CoverID`, id);
});
}
// Dynamic Cover Files
let fileIndex = 0;
let itemIndex = 0;
document.querySelectorAll('.cover-upload').forEach(input => {
const file = input.files[0];
if (file) {
formData.append(`CoverFiles[${fileIndex}].File`, file);
formData.append(`CoverFiles[${fileIndex}].CoverId`, input.dataset.coverid);
formData.append(`CoverFiles[${fileIndex}].Label`, input.dataset.label);
formData.append(`CoverFiles[${fileIndex}].coverUploadRequirementID`, input.name);
fileIndex++;
}
});
// Declaration Items
document.querySelectorAll("#tblDeclarationItems tbody tr").forEach(row => {
const itemName = row.querySelector(".item-name")?.value.trim();
const amount = row.querySelector(".item-amount")?.value;
// Ignore empty rows
if (!itemName || !amount)
return;
formData.append(`DeclarationItems[${itemIndex}].ItemName`, itemName);
formData.append(`DeclarationItems[${itemIndex}].Amount`, amount);
itemIndex++;
});
return formData;
}