'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
- PersonViewModel
public class PersonViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string CellNumber { get; set; }
}
- AddressViewModel
public class AddressViewModel
{
public string StreetName { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
}
- FamilyViewModel
public class FamilyViewModel
{
public PersonViewModel Person { get; set; }
public AddressViewModel Address { get; set; }
}
- 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>
- 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
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 |





