#c# #asp.net-core-mvc #asp.net-core-webapi #razor-pages
Вопрос:
Итак, во-первых, у меня есть таблицы родителей, учащихся и учащихся текущего года, ученику требуется родитель, поэтому очевидно, что его нужно было бы добавить первым перед остальными. Моя проблема заключается в том, как я могу изменить результат действия Edit/UpdateStudent для редактирования данных в моей базе данных, используя мою модель представления.
Это моя модель представления:
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; }
}
Это мое создание, в котором пользователь добавляет 3 вышеупомянутых объекта в свои относительные таблицы в базе данных в одном представлении.
Это мой метод создания действия
// 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);
}
Здесь у меня есть кнопка редактирования, она находится в моем файле ViewStudents.cshtml. Он использует модель CurrentYearStudents, поэтому я не могу получить доступ к родительскому идентификатору:
@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>
Вот как выглядят мои 3 таблицы внутри SQL Server
Мне действительно не помешала бы помощь, я занимаюсь этой проблемой уже 2 дня и безрезультатно.
Если вы хотите увидеть мое действие по обновлению, вы можете спросить, однако оно почти идентично добавлению, но только что прокомментировано, я не знаю, как двигаться дальше… Пожалуйста, пожалуйста, пожалуйста, помогите, я сейчас в растерянности, я не часто обращаюсь за помощью. (Просто кто я такой 🙁 )
Изменить представление:
@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>
Это мой текущий результат действия по обновлению (Да, вероятно, очень неправильный, но он позволяет редактировать идентификатор студента)
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);
}
Комментарии:
1. Могу я узнать ваши ожидания здесь? Что именно вы хотите обновить в 3 таблицах из вашей модели представления? Вы имеете в виду эту
StudentParentViewModel
модель просмотра? если да, то каково ваше мнение об этом?2. Добавьте необходимую информацию, чтобы ваша проблема могла быть легко воспроизводимой. Этот вопрос трудно воспроизвести, так как в нем много зависимостей, которые не были включены. Попробуйте добавить пример, чтобы загрузить свое
RegisterStudent
представление иedit
контекст, чтобы было намного проще показать вам следующие шаги, в которых вы застряли.3. @MdFaridUddinKiron Итак, я пытаюсь обновить все данные из таблицы учащихся, затем сведения о родителе, к которому принадлежит учащийся, а также о том, в каком классе, классе и году находится учащийся, в моем представлении отображается только таблица CurrentYearStudent. Я добавил представление для страницы редактирования, где они изменяют свои данные.
4. Если это можно воспроизвести, то, возможно, будет проще указать на вашу проблему
5. @MdFaridUddinKiron итак, что кому-то нужно, чтобы воспроизвести это в том виде, в каком оно есть? мое представление о создании? результат моего текущего нерабочего действия по обновлению?
Ответ №1:
Что ж, давайте начнем с вашего комментария ниже..
«Однако я понятия не имею, почему мой Http-пост: не работает»
Это из-за вашего этого кода @using (Html.BeginForm())
, вместо этого он должен быть таким @using (Html.BeginForm("ActionName", "controllerName"))
Как я могу обновить свои 3 таблицы с помощью моей модели представления:
Пожалуйста, выполните следующие действия
Модель Студента Для Загрузки Списка Первой:
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; }
}
Контроллер Для Загрузки Списка Учащихся:
Я не уверен, какой подход вы используете для привязки данных database first
или code first
. Я связываю данные из базы данных, как показано ниже:
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);
}
Просмотр Списка Учащихся:
@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>
Примечание: Для загрузки этого представления я использую ваш
student
доменный класс.
Выход:
Операция Обновления:
Когда вы нажмете на кнопку редактирования, она должна загрузить ваше представление с viewmodel
типом. итак, где мы будем использовать ваши StudentParentViewModel
Модель представления:
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; }
}
Контроллер обновления:
Когда вы нажмете на edit
кнопку, она ударит по контроллеру с определенной id
. Поэтому здесь мы свяжем ViewModel
после получения подробной информации с этим id
и вернем представление для загрузки 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);
}
Вид обновления:
@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>
}
Вывод представления Upate:
Контроллер обновления:
Когда будет загружено представление обновления, после необходимого обновления мы нажмем кнопку обновления, которая отправит обновленные данные UpdateStudent
контроллеру с нашими StudentParentViewModel
, как показано ниже:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateStudent(StudentParentViewModel viewModel)
{
//If either of this is empty then add
if (viewModel.StudentID == 0 amp;amp; 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");
}
Примечание: Like Student
и Parent
таблица вы можете привязать данные модели представления к Nth
номеру таблицы, как я показал выше. Наконец, перенаправьте страницу обновления на страницу списка.
Конечный Результат:
Примечание: Я обнаружил некоторую несогласованность в вашем коде, которую вы могли бы улучшить, например, если свойство класса вы пишете как
Parent_Name
, то везде соблюдайтеunder score
соглашение. Еслиcamel case
parentName
тогдаcamel case
везде, как мудроpascal case
ParentTypeID
, то следуйте этому везде, где это уменьшает запах кода и делает код более читабельным.
Надеюсь, что описанные выше шаги помогут вам решить вашу проблему.
Комментарии:
1. Я навсегда запомню твое имя как МОЕГО СПАСИТЕЛЯ, я приму к сведению соглашения об именовании. От всего сердца благодарю вас, благодарю вас, благодарю вас!
2. Просто еще один момент, я думаю, где вы говорите
_context.Students.Add(student);
, и_context.parents.Add(parent);
поэтому для этих 2 строк я думаю, что это приводит к тому, что данные добавляют запись с новым обновлением, приложенным к ее обновлению. Возможно, вы знаете, в чем проблема? @Md Фарид Уддин Кирон3. В начале вы можете заметить, что при методе обновления я проверил идентификатор учащегося и родителя, это означает, что при создании нового учащегося и родителей в то время не было бы идентификатора, поэтому, когда будет идентификатор, мы обновляем, а когда нет идентификатора, нужно добавлять. Просто проверьте логику самостоятельно и дайте мне знать ваши отзывы.
4. Я пытался использовать метод обновления как для добавления, так и для запроса на обновление. Вы можете сделать это отдельно, чтобы не было никаких проблем.
5. Вы можете удалить
if
часть, удалитьelse
и сохранить код внутриelse
части, которая работает только для обновления. Надеюсь, вы поняли мою мысль.