'Save multiple records of same model in ASP.NET 5

I have a form where user need to enter first name, last name, email, cell phone and address. If the user is a group, then everything except address needs to be added again. My current code can save only one personal and address detail. Could you please guide me on how to change the code to accommodate this need?

I created three viewmodels

  1. PersonViewModel
  public class PersonViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string CellNumber { get; set; }
    }
  1. AddressViewModel
   public class AddressViewModel
    {
        public string StreetName { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }
    }
  1. FamilyViewModel
   public class FamilyViewModel
    {
        public PersonViewModel Person { get; set; }
        public AddressViewModel Address { get; set; }
    }
  1. cshtml file
@model WebApplication2.ViewModels.FamilyViewModel
@{
    Layout = "_Layout";
}

<form asp-controller="Register" asp-action="SaveDetails" method="post">
    <br /><br />
    <div class="row">
        <div class="col">
            <label asp-for="Person.FirstName"></label>
            <input asp-for="Person.FirstName" />
        </div>
        <div class="col">
            <label asp-for="Person.LastName"></label>
            <input asp-for="Person.LastName" />
        </div>
    </div>
    <div class="row" id="">
        <div class="col">
            <label asp-for="Person.Email"></label>
            <input asp-for="Person.Email" />
        </div>
        <div class="col">
            <label asp-for="Person.CellNumber"></label>
            <input asp-for="Person.CellNumber" />
        </div>
    </div>
    <div class="row">
        <div class="col">
            <label asp-for="Address.StreetName"></label>
            <input asp-for="Address.StreetName" />
        </div>
        <div class="col">
            <label asp-for="Address.City"></label>
            <input asp-for="Address.City" />
        </div>
    </div>
     <div class="row">
        <div class="col">
            <label asp-for="Address.PostalCode"></label>
            <input asp-for="Address.PostalCode" />
        </div>
    </div>
    <div><br /><br /></div>
    <div class="row">
        <div class="col-sm-3">
            <a class="btn btn-primary" id="addMore">Add More Member of Group</a>        
        </div>        
        <div class="col-sm-3">
            <button class="btn btn-primary">Submit</button>
        </div>
    </div>
</form>
  1. Controller Action
[HttpPost]
        public IActionResult SaveDetails(FamilyViewModel familyViewModel)
        {
            //Console.WriteLine("Reached action");
            if (ModelState.IsValid)
            {
                PersonalDetail personalDetail = new PersonalDetail
                {
                    FirstName = familyViewModel.Person.FirstName,
                    LastName = familyViewModel.Person.LastName,
                    Email = familyViewModel.Person.Email,
                    CellNumber = familyViewModel.Person.CellNumber
                };
                Address address = new Address
                {
                    StreetName = familyViewModel.Address.StreetName,
                    City = familyViewModel.Address.City,
                    PostalCode = familyViewModel.Address.PostalCode
                };
                context.PersonalDetails.Add(personalDetail);
                context.Address.Add(address);
                context.SaveChanges();
            }
            return View(familyViewModel);
        }

Thank you Jeremy



Solution 1:[1]

I suggest you need add AddressID in your PersonViewModel Class. When you want create a group data, you can pass the params to your page.

My test code.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Net5_MVC.Models
{
    public class PersonViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string CellNumber { get; set; }
        public string AddressID { get; set; }
    }
    public class AddressViewModel
    {
        public string ID { get; set; }
        public string StreetName { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }
    }
    public class FamilyViewModel
    {
        public List<PersonViewModel> Person { get; set; }
        public List<AddressViewModel> Address { get; set; }
    }
}

My test cshtml

@model Net5_MVC.Models.FamilyViewModel
@{
    ViewData["Title"] = "https://stackoverflow.com/questions/71086541/save-multiple-records-of-same-model-in-asp-net-5";
    int personcount = 3;
    int addresscount = 1;
    string AddressID = Guid.NewGuid().ToString();
}

<form asp-controller="Home" asp-action="SaveDetails" method="post">
    <br /><br />
    <h3>Person Area</h3>
    @for (int i = 0; i < personcount; i++)
    {
        <input asp-for="Person[i].AddressID" value="@AddressID" hidden="hidden" />
        <div class="row">
            <div class="col">
                <label asp-for=" Person[i].FirstName"></label>
                <input asp-for="Person[i].FirstName" />
            </div>
            <div class="col">
                <label asp-for="Person[i].LastName"></label>
                <input asp-for="Person[i].LastName" />
            </div>
        </div>
        <div class="row" id="">
            <div class="col">
                <label asp-for="Person[i].Email"></label>
                <input asp-for="Person[i].Email" />
            </div>
            <div class="col">
                <label asp-for="Person[i].CellNumber"></label>
                <input asp-for="Person[i].CellNumber" />
            </div>
        </div>
        <hr />
    }

    <h3>Address Area</h3>
    @for (int i = 0; i < addresscount; i++)
    {
        <input asp-for="Address[i].ID" value="@AddressID"  hidden="hidden" />
        <div class="row">
            <div class="col">
                <label asp-for="Address[i].StreetName"></label>
                <input asp-for="Address[i].StreetName" />
            </div>
            <div class="col">
                <label asp-for="Address[i].City"></label>
                <input asp-for="Address[i].City" />
            </div>
        </div>
        <div class="row">
            <div class="col">
                <label asp-for="Address[i].PostalCode"></label>
                <input asp-for="Address[i].PostalCode" />
            </div>
        </div>
        <hr />
    }

    <div><br /><br /></div>
    <div class="row">
        <div class="col-sm-3">
            <a class="btn btn-primary" id="addMore">Add More Member of Group</a>
        </div>
        <div class="col-sm-3">
            <button class="btn btn-primary">Submit</button>
        </div>
    </div>
</form>

Test Method

[HttpPost]
public IActionResult SaveDetails(FamilyViewModel familyViewModel)
{
    List<PersonViewModel> personlist = familyViewModel.Person;
    List<AddressViewModel> addresslist = familyViewModel.Address;
    return Ok();
}

Test Result

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Jason