繁体   English   中英

如何将数据从多个模型传递到视图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM