[英]How to pass data from multiple models to a view?
我有3个型号
学生
public class Student
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; } //primary key
[RegularExpression(@"^[ A-Za-z]*$", ErrorMessage = "Only Alphabet allowed")]
[Required] //Because you can't leave this field empty
public string Name { get; set; }
[RegularExpression(@"^[ A-Za-z]*$", ErrorMessage = "Only Alphabet allowed")]
[Required]
public string LastName { get; set; }
[RegularExpression(@"^(\d{1,3})/\d{4}$", ErrorMessage = "Format has to be 1-3digit number/year; example 100/2015")]
[Required]
public string BI { get; set; }
}
学科
public class Subject
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[RegularExpression(@"^[ A-Za-z0-9]*$", ErrorMessage = "Only Alphabet and numbers allowed")]
[Required]
public string SubjectName { get; set; }
}
考试
public class Exam
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public int StudentID { get; set; }
public int SubjectID { get; set; }
[Range(6, 10)]
public int Grade { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime EnrollmentDate { get; set; }
}
视图模型
public class ViewModel
{
public Student Students;
public IEnumerable<Exam> Exams;
public IEnumerable<Subject> Subjects;
}
我想将数据从StudentsController传递到edit.cshtml,以便能够从下拉菜单中编辑SubjectName和Grade。 我还从这3个对象创建了ViewModel,并包含了ViewModel。 我只是不知道如何将ViewModel从控制器传递到视图。 有任何想法吗?
控制器编辑
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var student = await _context.Student.SingleOrDefaultAsync(m => m.ID == id);
if (student == null)
{
return NotFound();
}
return View(student);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Name,LastName,BI,SubjectName,Grade")] ViewModel student)
{
if (id != student.Students.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(student);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!StudentExists(student.Students.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(student);
}
我认为viewmodel
应该只具有要在该view
上使用的属性,而不是整个model
。
但是您可以像这样传递一个ViewModel
:
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var student = await _context.Student.SingleOrDefaultAsync(m => m.ID == id);
if (student == null)
{
return NotFound();
}
ViewModel model = new ViewModel();
model.Student = student;
return View(model);
}
然后在您的edit.cshtml
您需要@model namespace.ViewModel
然后在Post
方法上,还应该使用ViewModel
而不是Bind
:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, ViewModel model)
{
(...)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.