So firstly, I have Parent, Student and Current Year Student tables, a student requires a parent so obviously that would needed to be added first before the rest. My Problem is how I can change the Edit/UpdateStudent Action Result to edit the data in my database, using my ViewModel.
This is my View Model:
public class StudentParentViewModel
{
//parent
public int ParentID { get; set; }
public string Title { get; set; }
public int Contact_Number { get; set; }
public Nullable<int> Alt_Contact_Number { get; set; }
public string Email_Address { get; set; }
public string Home_Address { get; set; }
public int ParentTypeID { get; set; }
public string Parent_Name { get; set; }
public string Parent_Middle_Name { get; set; }
public string Parent_Surame { get; set; }
public long PID_Number { get; set; }
//student
public int StudentID { get; set; }
public System.DateTime DoB { get; set; }
public string Gender { get; set; }
public bool Remember { get; set; }
public int Student_TypeID { get; set; }
public string Student_Name { get; set; }
public string Student_Middle_Name { get; set; }
public string Student_Lastname { get; set; }
public long SID_Number { get; set; }
//current year student
public int CurrentYearStudentID { get; set; }
public Nullable<int> GradeID { get; set; }
public Nullable<int> ClassID { get; set; }
public Nullable<int> YearID { get; set; }
}
This is my Create, where the user adds the 3 above mentioned entities to their relative tables in the database all at one on one view.
This is my Create Action Method
// GET: Students/Create
public ActionResult RegisterStudent()
{
ThorntreeDatabaseEntities db = new ThorntreeDatabaseEntities();
ViewBag.ParentTypeID = new SelectList(db.ParentTypes, "Parent_TypeID", "Parent_Type");
ViewBag.Student_TypeID = new SelectList(db.StudentTypes, "Student_TypeID", "Student_Type");
ViewBag.ClassID = new SelectList(db.Classes, "ClassID", "Class_Name");
ViewBag.GradeID = new SelectList(db.Grades, "GradeID", "Grade_Name");
ViewBag.YearID = new SelectList(db.Years, "YearID", "Year1");
return View();
}
// POST: Students/Create
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RegisterStudent(StudentParentViewModel studentParentViewModel)
{
ThorntreeDatabaseEntities db = new ThorntreeDatabaseEntities();
List<Class> ClassList = db.Classes.ToList();
ViewBag.ClassID = new SelectList(ClassList, "ClassID", "Class_Name");
List<Grade> GradeList = db.Grades.ToList();
ViewBag.GradeID = new SelectList(GradeList, "GradeID", "Grade_Name");
List<Year> YearList = db.Years.ToList();
ViewBag.YearID = new SelectList(YearList, "YearID", "Year1");
List<StudentType> TypeList = db.StudentTypes.ToList();
ViewBag.Student_TypeID = new SelectList(TypeList, "Student_TypeID", "Student_Type");
List<ParentType> ParentList = db.ParentTypes.ToList();
ViewBag.ParentTypeID = new SelectList(db.ParentTypes, "Parent_TypeID", "Parent_Type");
//Parent
Parent parent = new Parent();
parent.Title = studentParentViewModel.Title;
parent.Parent_Name = studentParentViewModel.Parent_Name;
parent.Parent_Middle_Name = studentParentViewModel.Parent_Middle_Name;
parent.Parent_Surame = studentParentViewModel.Parent_Surame;
parent.Home_Address = studentParentViewModel.Home_Address;
parent.PID_Number = studentParentViewModel.PID_Number;
parent.Contact_Number = studentParentViewModel.Contact_Number;
parent.Alt_Contact_Number = studentParentViewModel.Alt_Contact_Number;
parent.Email_Address = studentParentViewModel.Email_Address;
parent.ParentTypeID = studentParentViewModel.ParentTypeID;
db.Parents.Add(parent);
db.SaveChanges();
int latestParentID = parent.ParentID;
Student student = new Student();
student.Student_Name = studentParentViewModel.Student_Name;
student.Student_Middle_Name = studentParentViewModel.Student_Middle_Name;
student.Student_Lastname = studentParentViewModel.Student_Lastname;
student.DoB = studentParentViewModel.DoB;
student.SID_Number = studentParentViewModel.SID_Number;
student.Gender = studentParentViewModel.Gender;
student.Student_TypeID = studentParentViewModel.Student_TypeID;
student.ParentID = latestParentID;
db.Students.Add(student);
db.SaveChanges();
int latestStudentId = student.StudentID;
CurrentYearStudent current = new CurrentYearStudent();
current.ClassID = studentParentViewModel.ClassID;
current.GradeID = studentParentViewModel.GradeID;
current.YearID = studentParentViewModel.YearID;
current.StudentID = latestStudentId;
db.CurrentYearStudents.Add(current);
db.SaveChanges();
if (ModelState.IsValid)
{
db.SaveChanges();
return RedirectToAction("ViewStudents");
}
return View(studentParentViewModel);
}
This is where I have the edit button, it is on my ViewStudents.cshtml. It is using the CurrentYearStudents model so I cant access the ParentID:
@model IEnumerable<Thorntree_Primary_School_INF_370_System.Models.CurrentYearStudent>
@{
ViewBag.Title = "View Students";
}
<html>
<head>
<style>
input[type="text"] {
position: center;
display: block;
margin: 0 auto;
}
input[type="file"] {
position: center;
display: block;
margin: 0 auto;
}
button[type="submit"] {
position: center;
display: block;
margin: 0 auto;
}
#tableHeadder {
display: table-header-group;
}
</style>
</head>
<body>
<h2>Hello</h2>
<h3>World</h3>
<div class="container" style="outline:solid">
<button class="btn bg-primary" style="">Back</button>
<div @*style="text-align:center"*@>
<h1>View Students</h1>
@using (Html.BeginForm("ViewStudents", "Student", FormMethod.Get))
{
//the following are search options
<b> Search Option: </b>@Html.RadioButton("option", "FirstName") <label>Name</label> @Html.RadioButton("option", "Grade") <label>Grade</label>
@Html.RadioButton("option", "Class")<label>Class</label> @Html.RadioButton("option", "None") <label>None</label> @Html.TextBox("search") <input type="submit" name="submit" value="Search" />
}
<table class="table table-dark">
<thead id="tableHeadder">
<tr>
<th scope="col">First Name</th>
<th scope="col">Last Name</th>
<th scope="col">Grade</th>
<th scope="col">Class</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Student.Student_Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Student.Student_Lastname)
</td>
<td>
@Html.DisplayFor(modelItem => item.Grade.Grade_Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Class.Class_Name)
</td>
<td>
@Html.ActionLink("Edit", "UpdateStudent", new { id = item.StudentID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.CurrentYearStudentID })
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</body>
</html>
This is how my 3 tables look inside SQL Server
I could really use some assistance, I've been at this problem for 2 days now and to no avail.
If you would like to see my update action you may ask, however its almost identical to the add one but just commented out, I don't know how to go about moving on... Please please please help, I'm at a loss right now, its not often I look for help. (Just who I am :( )
Edit View:
@model Thorntree_Primary_School_INF_370_System.Models.StudentParentViewModel
@{
ViewBag.Title = "Update Student";
}
@*<html>
<head>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4 style="color:white">Parent of Student</h4>
<h4 style="color:white">Parent of Student</h4>
<h4 style="color:white">Parent of Student</h4>
<h4 style="color:white">Parent of Student</h4>
<h4>Parent of Student</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<label for="Title" class="control-label col-md-2">Title</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control", @value = Model.Title } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Contact_Number" class="control-label col-md-2">Contact Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Contact_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.Contact_Number } })
@Html.ValidationMessageFor(model => model.Contact_Number, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Alt_Contact_Number" class="control-label col-md-2">Alternative Contact Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Alt_Contact_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.Alt_Contact_Number } })
@Html.ValidationMessageFor(model => model.Alt_Contact_Number, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Email_Address" class="control-label col-md-2">Email Address</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Email_Address, new { htmlAttributes = new { @class = "form-control", @value = Model.Email_Address } })
@Html.ValidationMessageFor(model => model.Email_Address, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Home_Address" class="control-label col-md-2">Home Address</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Home_Address, new { htmlAttributes = new { @class = "form-control", @value = Model.Home_Address } })
@Html.ValidationMessageFor(model => model.Home_Address, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="ParentTypeID" class="control-label col-md-2">Parent Type</label>
<div class="col-md-10">
@Html.DropDownList("ParentTypeID", null, htmlAttributes: new { @class = "form-control", @value = Model.ParentTypeID })
@Html.ValidationMessageFor(model => model.ParentTypeID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Parent_Name" class="control-label col-md-2">Parent Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Parent_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Parent_Name } })
@Html.ValidationMessageFor(model => model.Parent_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Parent_Middle_Name" class="control-label col-md-2">Parent Middle Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Parent_Middle_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Parent_Middle_Name } })
@Html.ValidationMessageFor(model => model.Parent_Middle_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Parent_Surame" class="control-label col-md-2">Parent Surname</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Parent_Surame, new { htmlAttributes = new { @class = "form-control", @value = Model.Parent_Surame } })
@Html.ValidationMessageFor(model => model.Parent_Surame, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="PID_Number" class="control-label col-md-2">Parent ID Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.PID_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.PID_Number } })
@Html.ValidationMessageFor(model => model.PID_Number, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-horizontal">
<h4>Student</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<label for="DoB" class="control-label col-md-2">Date of Birth</label>
<div class="col-md-10">
@Html.EditorFor(model => model.DoB, new { htmlAttributes = new { @class = "form-control", @value = Model.DoB } })
@Html.ValidationMessageFor(model => model.DoB, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="DoB" class="control-label col-md-2">Gender</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Gender, new { htmlAttributes = new { @class = "form-control", @value = Model.Gender } })
@Html.ValidationMessageFor(model => model.Gender, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_TypeID" class="control-label col-md-2">Student Type</label>
<div class="col-md-10">
@Html.DropDownList("Student_TypeID", null, htmlAttributes: new { @class = "form-control", @value = Model.Student_TypeID })
@Html.ValidationMessageFor(model => model.Student_TypeID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_Name" class="control-label col-md-2">Student Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Student_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Student_Name } })
@Html.ValidationMessageFor(model => model.Student_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_Middle_Name" class="control-label col-md-2">Student Middle Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Student_Middle_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Student_Middle_Name } })
@Html.ValidationMessageFor(model => model.Student_Middle_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_Lastname" class="control-label col-md-2">Student Surname</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Student_Lastname, new { htmlAttributes = new { @class = "form-control", @value = Model.Student_Lastname } })
@Html.ValidationMessageFor(model => model.Student_Lastname, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="SID_Number" class="control-label col-md-2">Student ID Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.SID_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.SID_Number } })
@Html.ValidationMessageFor(model => model.SID_Number, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-horizontal">
<h4>Register</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
</div>
<div class="form-group">
<label for="GradeID" class="control-label col-md-2">Enrollment for Grade</label>
<div class="col-md-10">
@Html.DropDownList("GradeID", null, htmlAttributes: new { @class = "form-control", @value = Model.GradeID })
@Html.ValidationMessageFor(model => model.GradeID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="ClassID" class="control-label col-md-2">Enrollment for Class</label>
<div class="col-md-10">
@Html.DropDownList("ClassID", null, htmlAttributes: new { @class = "form-control", @value = Model.ClassID })
@Html.ValidationMessageFor(model => model.ClassID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="YearID" class="control-label col-md-2">Enrollment for Class</label>
<div class="col-md-10">
@Html.DropDownList("YearID", null, htmlAttributes: new { @class = "form-control", @value = Model.YearID })
@Html.ValidationMessageFor(model => model.YearID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
</div>
}
<div>
<button>@Html.ActionLink("Back to List", "ViewStudents")</button>
</div>
This is my current Update Action result (Yes probably very wrong but it does get the StudentID to edit)
public ActionResult UpdateStudent(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ThorntreeDatabaseEntities db = new ThorntreeDatabaseEntities();
List<Class> ClassList = db.Classes.ToList();
ViewBag.ClassID = new SelectList(ClassList, "ClassID", "Class_Name");
List<Grade> GradeList = db.Grades.ToList();
ViewBag.GradeID = new SelectList(GradeList, "GradeID", "Grade_Name");
List<Year> YearList = db.Years.ToList();
ViewBag.YearID = new SelectList(YearList, "YearID", "Year1");
List<StudentType> TypeList = db.StudentTypes.ToList();
ViewBag.Student_TypeID = new SelectList(TypeList, "Student_TypeID", "Student_Type");
List<ParentType> ParentList = db.ParentTypes.ToList();
ViewBag.ParentTypeID = new SelectList(db.ParentTypes, "Parent_TypeID", "Parent_Type");
StudentParentViewModel viewModel = new StudentParentViewModel();
Student student = db.Students.Find(id);
Parent parent = db.Parents.Find(student.ParentID);
db.Students.Where(x => x.StudentID == parent.ParentID);
viewModel.Title = parent.Title;
viewModel.Parent_Name = parent.Parent_Name;
viewModel.Parent_Middle_Name = parent.Parent_Middle_Name;
viewModel.Parent_Surame = parent.Parent_Surame;
viewModel.Home_Address = parent.Home_Address;
viewModel.PID_Number = parent.PID_Number;
viewModel.Contact_Number = parent.Contact_Number;
viewModel.Alt_Contact_Number = parent.Alt_Contact_Number;
viewModel.Email_Address = parent.Email_Address;
viewModel.ParentTypeID = parent.ParentTypeID;
viewModel.ParentID = parent.ParentID;
int latestParentID = parent.ParentID;
viewModel.StudentID = student.StudentID;
viewModel.Student_Name = student.Student_Name;
viewModel.Student_Middle_Name = student.Student_Middle_Name;
viewModel.Student_Lastname = student.Student_Lastname;
viewModel.DoB = student.DoB;
viewModel.SID_Number = student.SID_Number;
viewModel.Gender = student.Gender;
viewModel.Student_TypeID = student.Student_TypeID;
student.ParentID = latestParentID;
int latestStudentId = student.StudentID;
db.Students.Where(x => x.StudentID == parent.ParentID);
viewModel.Title = parent.Parent_Name;
viewModel.Parent_Name = parent.Parent_Name;
viewModel.Parent_Middle_Name = parent.Parent_Middle_Name;
viewModel.Parent_Surame = parent.Parent_Surame;
viewModel.Home_Address = parent.Home_Address;
viewModel.PID_Number = parent.PID_Number;
viewModel.Contact_Number = parent.Contact_Number;
viewModel.Alt_Contact_Number = parent.Alt_Contact_Number;
viewModel.Email_Address = parent.Email_Address;
viewModel.ParentTypeID = parent.ParentTypeID;
CurrentYearStudent current = new CurrentYearStudent();
viewModel.ClassID = current.ClassID;
viewModel.GradeID = current.GradeID;
viewModel.YearID = current.YearID;
viewModel.StudentID = latestStudentId;
ViewBag.ParentTypeID = new SelectList(db.ParentTypes, "Parent_TypeID", "Parent_Type");
ViewBag.Student_TypeID = new SelectList(db.StudentTypes, "Student_TypeID", "Student_Type");
ViewBag.ClassID = new SelectList(db.Classes, "ClassID", "Class_Name");
ViewBag.GradeID = new SelectList(db.Grades, "GradeID", "Grade_Name");
ViewBag.YearID = new SelectList(db.Years, "YearID", "Year1");
return View(viewModel);
}
// POST: Students/Update/5
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateStudent(StudentParentViewModel viewModel)
{
ThorntreeDatabaseEntities db = new ThorntreeDatabaseEntities();
List<Class> ClassList = db.Classes.ToList();
ViewBag.ClassID = new SelectList(ClassList, "ClassID", "Class_Name");
List<Grade> GradeList = db.Grades.ToList();
ViewBag.GradeID = new SelectList(GradeList, "GradeID", "Grade_Name");
List<Year> YearList = db.Years.ToList();
ViewBag.YearID = new SelectList(YearList, "YearID", "Year1");
List<StudentType> TypeList = db.StudentTypes.ToList();
ViewBag.Student_TypeID = new SelectList(TypeList, "Student_TypeID", "Student_Type");
List<ParentType> ParentList = db.ParentTypes.ToList();
ViewBag.ParentTypeID = new SelectList(db.ParentTypes, "Parent_TypeID", "Parent_Type");
Parent parent = new Parent();
parent.Title = viewModel.Title;
parent.Parent_Name = viewModel.Parent_Name;
parent.Parent_Middle_Name = viewModel.Parent_Middle_Name;
parent.Parent_Surame = viewModel.Parent_Surame;
parent.Home_Address = viewModel.Home_Address;
parent.PID_Number = viewModel.PID_Number;
parent.Contact_Number = viewModel.Contact_Number;
parent.Alt_Contact_Number = viewModel.Alt_Contact_Number;
parent.Email_Address = viewModel.Email_Address;
parent.ParentTypeID = viewModel.ParentTypeID;
int latestParentID = parent.ParentID;
Student student = new Student();
student.Student_Name = viewModel.Student_Name;
student.Student_Middle_Name = viewModel.Student_Middle_Name;
student.Student_Lastname = viewModel.Student_Lastname;
student.DoB = viewModel.DoB;
student.SID_Number = viewModel.SID_Number;
student.Gender = viewModel.Gender;
student.Student_TypeID = viewModel.Student_TypeID;
student.ParentID = latestParentID;
int latestStudentId = student.StudentID;
ViewBag.ParentID = new SelectList(db.Parents, "ParentID", "Title", student.ParentID);
CurrentYearStudent current = new CurrentYearStudent();
current.ClassID = viewModel.ClassID;
current.GradeID = viewModel.GradeID;
current.YearID = viewModel.YearID;
current.StudentID = latestStudentId;
db.CurrentYearStudents.Add(current);
ViewBag.Student_TypeID = new SelectList(db.StudentTypes, "Student_TypeID", "Student_Type", student.Student_TypeID);
if (ModelState.IsValid)
{
db.Entry(student).State = EntityState.Modified;
db.Entry(parent).State = EntityState.Modified;
db.Entry(current).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("ViewStudents");
}
return View(viewModel);
}
Well lets start with your comment below..
"However I have no idea why my Http Post: is not working"
Its because of your this code @using (Html.BeginForm())
instead it should be like @using (Html.BeginForm("ActionName", "controllerName"))
How can I update my 3 tables using my viewmodel:
Please follow the steps below
Student Model To Load List First:
public class Student
{
[Key]
public int StudentID { get; set; }
public string DoB { get; set; }
public string Gender { get; set; }
public bool Remember { get; set; }
public string Student_Name { get; set; }
public string Student_Middle_Name { get; set; }
public string Student_Lastname { get; set; }
public long SID_Number { get; set; }
[ForeignKey("Parent")]
public int ParentID { get; set; }
[ForeignKey("StudentType")]
public int StudentTypeID { get; set; }
[ForeignKey("Grades")]
public int GradeID { get; set; }
[ForeignKey("Year")]
public int YearID { get; set; }
[ForeignKey("ClassType")]
public int ClassTypeID { get; set; }
public virtual StudentType StudentType { get; set; }
public virtual Parent Parent { get; set; }
public virtual Grades Grades { get; set; }
public virtual Year Year { get; set; }
public virtual ClassType ClassType { get; set; }
}
Controller For Loading Students List:
I am not sure which approach you are using for binding data database first
or code first
. I am binding data from database like below:
public IActionResult GetAllStudents()
{
var obj = _context.Students.Include(st => st.StudentType).Include(pt => pt.Parent).Include(y => y.Year).Include(ct => ct.ClassType).ToList();
return View(obj);
}
View For Student List:
@model IEnumerable<MVCApps.Models.Student>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table table table-bordered">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.StudentID)
</th>
<th>
@Html.DisplayNameFor(model => model.DoB)
</th>
<th>
@Html.DisplayNameFor(model => model.Gender)
</th>
<th>
@Html.DisplayNameFor(model => model.Remember)
</th>
<th>
@Html.DisplayNameFor(model => model.Student_Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Student_Middle_Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Student_Lastname)
</th>
<th>
@Html.DisplayNameFor(model => model.SID_Number)
</th>
<th>
@Html.DisplayNameFor(model => model.Parent.Parent_Name)
</th>
<th>
@Html.DisplayNameFor(model => model.StudentType)
</th>
<th>
@Html.DisplayNameFor(model => model.GradeID)
</th>
<th>
@Html.DisplayNameFor(model => model.YearID)
</th>
<th>
@Html.DisplayNameFor(model => model.ClassTypeID)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.StudentID)
</td>
<td>
@Html.DisplayFor(modelItem => item.DoB)
</td>
<td>
@Html.DisplayFor(modelItem => item.Gender)
</td>
<td>
@Html.DisplayFor(modelItem => item.Remember)
</td>
<td>
@Html.DisplayFor(modelItem => item.Student_Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Student_Middle_Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Student_Lastname)
</td>
<td>
@Html.DisplayFor(modelItem => item.SID_Number)
</td>
<td>
@Html.DisplayFor(modelItem => item.Parent.Parent_Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.StudentType.StudentTypeName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Grades.GradeName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Year.YearName)
</td>
<td>
@Html.DisplayFor(modelItem => item.ClassType.ClassTypeName)
</td>
<td>
@Html.ActionLink("Edit", "UpdateStudentById", new { id = item.StudentID }, new { @class = "btn btn-primary" })
</td>
<td>
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }, new { @class = "btn btn-info" })
</td>
<td>
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ }, new { @class = "btn btn-danger" })
</td>
</tr>
}
</tbody>
</table>
Note: For loading this view I am using your
student
domain class.
Output:
Update Operation:
When you would click on edit button it should load your view with viewmodel
type.
so where we will use your StudentParentViewModel
View Model:
public class StudentParentViewModel
{
//parent
public int ParentID { get; set; }
public string Title { get; set; }
public int Contact_Number { get; set; }
public Nullable<int> Alt_Contact_Number { get; set; }
public string Email_Address { get; set; }
public string Home_Address { get; set; }
public int ParentTypeID { get; set; }
public string Parent_Name { get; set; }
public string Parent_Middle_Name { get; set; }
public string Parent_Surame { get; set; }
public long PID_Number { get; set; }
//student
public int StudentID { get; set; }
public DateTime DoB { get; set; }
public string Gender { get; set; }
public bool Remember { get; set; }
public int StudentTypeID { get; set; }
public string Student_Name { get; set; }
public string Student_Middle_Name { get; set; }
public string Student_Lastname { get; set; }
public long SID_Number { get; set; }
//current year student
public int CurrentYearStudentID { get; set; }
public Nullable<int> GradeID { get; set; }
public Nullable<int> ClassTypeID { get; set; }
public Nullable<int> YearID { get; set; }
}
Update Controller:
When you would click on a edit
button it will hit the controller with a specific id
. So here we will bind the ViewModel
after getting the details information by that id
and return the view for loading update view
public ActionResult UpdateStudentById(int? id)
{
//Get student by ID
var studentObject = _context.Students.Include(st => st.StudentType).Include(pt => pt.Parent).Where(sid => sid.StudentID == id).FirstOrDefault();
//Bind Dropdown
List<StudentType> studentType = _context.studentTypes.ToList();
ViewBag.StudentTypeID = new SelectList(studentType, "StudentTypeID", "StudentTypeName");
//Bind ParentType Dropdown
List<ParentType> parentTypeList = _context.ParentTypes.ToList();
ViewBag.ParentTypeID = new SelectList(parentTypeList, "ParentTypeID", "ParentTypeName");
//class type
List<ClassType> classType = _context.classTypes.ToList();
ViewBag.ClassTypeID = new SelectList(classType, "ClassTypeID", "ClassTypeName");
//grade
List<Grades> grades = _context.Grades.ToList();
ViewBag.GradeID = new SelectList(grades, "GradeID", "GradeName");
//class type
List<Year> years = _context.Years.ToList();
ViewBag.YearID = new SelectList(years, "YearID", "YearName");
//Bind to View Model
StudentParentViewModel viewModel = new StudentParentViewModel();
//Student student = _context.Students.Find(id);
// Parent parent = _context.parents.Find(parent.ParentID);
//db.Students.Where(x => x.StudentID == parent.ParentID);
viewModel.Title = studentObject.Parent.Title;
viewModel.Parent_Name = studentObject.Parent.Parent_Name;
viewModel.Parent_Middle_Name = studentObject.Parent.Parent_Middle_Name;
viewModel.Parent_Surame = studentObject.Parent.Parent_Surame;
viewModel.Home_Address = studentObject.Parent.Home_Address;
viewModel.PID_Number = studentObject.Parent.PID_Number;
viewModel.Contact_Number = studentObject.Parent.Contact_Number;
viewModel.Alt_Contact_Number = studentObject.Parent.Alt_Contact_Number;
viewModel.Email_Address = studentObject.Parent.Email_Address;
viewModel.ParentTypeID = studentObject.Parent.ParentTypeID;
viewModel.ParentID = studentObject.Parent.ParentID;
int latestParentID = studentObject.Parent.ParentID;
viewModel.StudentID = studentObject.StudentID;
viewModel.Student_Name = studentObject.Student_Name;
viewModel.Student_Middle_Name = studentObject.Student_Middle_Name;
viewModel.Student_Lastname = studentObject.Student_Lastname;
viewModel.DoB = Convert.ToDateTime(studentObject.DoB);
viewModel.SID_Number = studentObject.SID_Number;
viewModel.Gender = studentObject.Gender;
viewModel.StudentTypeID = studentObject.StudentTypeID;
studentObject.ParentID = latestParentID;
int latestStudentId = studentObject.StudentID;
return View(viewModel);
}
Update View:
@model MVCApps.Models.StudentParentViewModel
@using (Html.BeginForm("UpdateStudent", "Student"))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4 style="color:white">Parent of Student</h4>
<h4 style="color:white">Parent of Student</h4>
<h4 style="color:white">Parent of Student</h4>
<h4 style="color:white">Parent of Student</h4>
<div class="form-horizontal">
<h4>Student</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group" hidden>
<label for="DoB" class="control-label col-md-2">StudentID</label>
<div class="col-md-10">
@Html.EditorFor(model => model.StudentID, new { htmlAttributes = new { @class = "form-control", @value = Model.StudentID } })
@Html.ValidationMessageFor(model => model.StudentID, "", new { @class = "text-danger" })
</div>
</div>
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<label for="DoB" class="control-label col-md-2">Date of Birth</label>
<div class="col-md-10">
@Html.EditorFor(model => model.DoB, new { htmlAttributes = new { @class = "form-control", @value = Model.DoB } })
@Html.ValidationMessageFor(model => model.DoB, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="DoB" class="control-label col-md-2">Gender</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Gender, new { htmlAttributes = new { @class = "form-control", @value = Model.Gender } })
@Html.ValidationMessageFor(model => model.Gender, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_TypeID" class="control-label col-md-2">Student Type</label>
<div class="col-md-10">
@Html.DropDownList("StudentTypeID", null, htmlAttributes: new { @class = "form-control", @value = Model.StudentTypeID })
@Html.ValidationMessageFor(model => model.StudentTypeID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_Name" class="control-label col-md-2">Student Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Student_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Student_Name } })
@Html.ValidationMessageFor(model => model.Student_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_Middle_Name" class="control-label col-md-2">Student Middle Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Student_Middle_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Student_Middle_Name } })
@Html.ValidationMessageFor(model => model.Student_Middle_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Student_Lastname" class="control-label col-md-2">Student Surname</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Student_Lastname, new { htmlAttributes = new { @class = "form-control", @value = Model.Student_Lastname } })
@Html.ValidationMessageFor(model => model.Student_Lastname, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="SID_Number" class="control-label col-md-2">Student ID Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.SID_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.SID_Number } })
@Html.ValidationMessageFor(model => model.SID_Number, "", new { @class = "text-danger" })
</div>
</div>
<h4>Parent of Student</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group" hidden>
<label for="Title" class="control-label col-md-2">StudentID</label>
<div class="col-md-10">
@Html.EditorFor(model => model.ParentID, new { htmlAttributes = new { @class = "form-control", @value = Model.ParentID } })
@Html.ValidationMessageFor(model => model.ParentID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Title" class="control-label col-md-2">Title</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control", @value = Model.Title } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Contact_Number" class="control-label col-md-2">Contact Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Contact_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.Contact_Number } })
@Html.ValidationMessageFor(model => model.Contact_Number, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Alt_Contact_Number" class="control-label col-md-2">Alternative Contact Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Alt_Contact_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.Alt_Contact_Number } })
@Html.ValidationMessageFor(model => model.Alt_Contact_Number, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Email_Address" class="control-label col-md-2">Email Address</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Email_Address, new { htmlAttributes = new { @class = "form-control", @value = Model.Email_Address } })
@Html.ValidationMessageFor(model => model.Email_Address, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Home_Address" class="control-label col-md-2">Home Address</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Home_Address, new { htmlAttributes = new { @class = "form-control", @value = Model.Home_Address } })
@Html.ValidationMessageFor(model => model.Home_Address, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="ParentTypeID" class="control-label col-md-2">Parent Type</label>
<div class="col-md-10">
@Html.DropDownList("ParentTypeID", null, htmlAttributes: new { @class = "form-control", @value = Model.ParentTypeID })
@Html.ValidationMessageFor(model => model.ParentTypeID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Parent_Name" class="control-label col-md-2">Parent Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Parent_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Parent_Name } })
@Html.ValidationMessageFor(model => model.Parent_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Parent_Middle_Name" class="control-label col-md-2">Parent Middle Name</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Parent_Middle_Name, new { htmlAttributes = new { @class = "form-control", @value = Model.Parent_Middle_Name } })
@Html.ValidationMessageFor(model => model.Parent_Middle_Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="Parent_Surame" class="control-label col-md-2">Parent Surname</label>
<div class="col-md-10">
@Html.EditorFor(model => model.Parent_Surame, new { htmlAttributes = new { @class = "form-control", @value = Model.Parent_Surame } })
@Html.ValidationMessageFor(model => model.Parent_Surame, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="PID_Number" class="control-label col-md-2">Parent ID Number</label>
<div class="col-md-10">
@Html.EditorFor(model => model.PID_Number, new { htmlAttributes = new { @class = "form-control", @value = Model.PID_Number } })
@Html.ValidationMessageFor(model => model.PID_Number, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-horizontal">
<h4>Register</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
</div>
<div class="form-group">
<label for="GradeID" class="control-label col-md-2">Enrollment for Grade</label>
<div class="col-md-10">
@Html.DropDownList("GradeID", null, htmlAttributes: new { @class = "form-control", @value = Model.GradeID })
@Html.ValidationMessageFor(model => model.GradeID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="ClassID" class="control-label col-md-2">Enrollment for Class</label>
<div class="col-md-10">
@Html.DropDownList("ClassTypeID", null, htmlAttributes: new { @class = "form-control", @value = Model.ClassTypeID })
@Html.ValidationMessageFor(model => model.ClassTypeID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label for="YearID" class="control-label col-md-2">Enrollment for Class</label>
<div class="col-md-10">
@Html.DropDownList("YearID", null, htmlAttributes: new { @class = "form-control", @value = Model.YearID })
@Html.ValidationMessageFor(model => model.YearID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Update" class="btn btn-success" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.ActionLink("List", "GetAllStudents", new { /* id=item.PrimaryKey */ }, new { @class = "btn btn-info" })
</div>
</div>
</div>
</div>
}
Output of Upate View:
Update Controller:
When update view would be loaded, after neccessary update we will hit update button which will send the updated data to UpdateStudent
controller with our StudentParentViewModel
like below:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateStudent(StudentParentViewModel viewModel)
{
//If either of this is empty then add
if (viewModel.StudentID == 0 && viewModel.ParentID == 0)
{
//Add Or Create
//Bind Student
var student = new Student();
student.Student_Name = viewModel.Student_Name;
student.Student_Middle_Name = viewModel.Student_Middle_Name;
student.Student_Lastname = viewModel.Student_Lastname;
student.Gender = viewModel.Gender;
student.StudentTypeID = viewModel.StudentTypeID;
student.ParentID = viewModel.ParentID;
student.DoB = viewModel.DoB.ToString();
student.GradeID = viewModel.GradeID??0;
student.ClassTypeID = viewModel.ClassTypeID??0;
student.YearID = viewModel.YearID??0;
student.ClassTypeID = viewModel.ClassTypeID??0;
_context.Students.Add(student);
_context.SaveChanges();
//Bind Parent
Parent parent = new Parent();
parent.Title = viewModel.Title;
parent.Parent_Name = viewModel.Parent_Name;
parent.Parent_Middle_Name = viewModel.Parent_Middle_Name;
parent.Parent_Surame = viewModel.Parent_Surame;
parent.Home_Address = viewModel.Home_Address;
parent.PID_Number = viewModel.PID_Number;
parent.Contact_Number = viewModel.Contact_Number;
parent.Alt_Contact_Number = viewModel.Alt_Contact_Number;
parent.Email_Address = viewModel.Email_Address;
parent.ParentTypeID = viewModel.ParentTypeID;
_context.parents.Add(parent);
_context.SaveChanges();
}
else
{
var findStudent = _context.Students.Find(viewModel.StudentID);
//Bind to student table
Student objStudent = new Student();
findStudent.Student_Name = viewModel.Student_Name;
findStudent.Student_Middle_Name = viewModel.Student_Middle_Name;
findStudent.Student_Lastname = viewModel.Student_Lastname;
findStudent.DoB = viewModel.DoB.ToString();
findStudent.SID_Number = viewModel.SID_Number;
findStudent.Gender = viewModel.Gender;
findStudent.StudentTypeID = viewModel.StudentTypeID;
findStudent.ParentID = viewModel.ParentID;
findStudent.ClassTypeID = viewModel.ClassTypeID??0;
findStudent.GradeID =(int) viewModel.GradeID;
findStudent.ParentID = viewModel.ParentID;
//Bind the parent table
var findParent = _context.parents.Find(viewModel.ParentID);
Parent objParent = new Parent();
findParent.Title = viewModel.Title;
findParent.Parent_Name = viewModel.Parent_Name;
findParent.Parent_Middle_Name = viewModel.Parent_Middle_Name;
findParent.Parent_Surame = viewModel.Parent_Surame;
findParent.Home_Address = viewModel.Home_Address;
findParent.PID_Number = viewModel.PID_Number;
findParent.Contact_Number = viewModel.Contact_Number;
findParent.Alt_Contact_Number = viewModel.Alt_Contact_Number;
findParent.Email_Address = viewModel.Email_Address;
findParent.ParentTypeID = viewModel.ParentTypeID;
_context.SaveChanges();
}
//Bind Dropdown
List<StudentType> studentType = _context.studentTypes.ToList();
ViewBag.StudentTypeID = new SelectList(studentType, "StudentTypeID", "StudentTypeName");
//Bind ParentType Dropdown
List<ParentType> parentTypeList = _context.ParentTypes.ToList();
ViewBag.ParentTypeID = new SelectList(parentTypeList, "ParentTypeID", "ParentTypeName");
//class type
List<ClassType> classType = _context.classTypes.ToList();
ViewBag.ClassTypeID = new SelectList(classType, "ClassTypeID", "ClassTypeName");
//grade
List<Grades> grades = _context.Grades.ToList();
ViewBag.GradeID = new SelectList(grades, "GradeID", "GradeName");
//class type
List<Year> years = _context.Years.ToList();
ViewBag.YearID = new SelectList(years, "YearID", "YearName");
// return Redirect()
return RedirectToAction("GetAllStudents");
}
Note: Like Student
and Parent
table you can bind your view model data to Nth
number of table like the way I have shown above. Finally redirect the update page to list page.
Final Output:
Note: I have found some inconsistency in your code which you could improve, like if class property you write as
Parent_Name
then follow theunder score
convention every where. Ifcamel case
parentName
thencamel case
every where, like wisepascal case
ParentTypeID
then follow that every where which reduce code smells and make the code more readable.
Hope above steps will help you to resolve your problem.