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

C# 如何将数据从多个模型传递到一个视图?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我有三种型号 学生 public class Student { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } //primary key [RegularExpression(@"^[ A-Za-z]*$", ErrorMessage = "Only Alphabet allowed")] [Required] //Because you c

我有三种型号

学生

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 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);
    }
公共异步任务编辑(int?id)
{
if(id==null)
{
返回NotFound();
}
var student=wait_context.student.SingleOrDefaultAsync(m=>m.ID==ID);
如果(学生==null)
{
返回NotFound();
}
返回视图(学生);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(int-id,[Bind(“id,Name,LastName,BI,SubjectName,Grade”)]ViewModel学生)
{
if(id!=student.Students.id)
{
返回NotFound();
}
if(ModelState.IsValid)
{
尝试
{
_更新(学生);
wait_context.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
如果(!StudentExists(student.Students.ID))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回重定向到操作(名称(索引));
}
返回视图(学生);
}

我认为
视图模型
应该只具有您将在该
视图
上使用的属性,而不是整个
模型

但是您可以像这样传递
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);
    }

你的动作方法是什么样子的?这是我从Controllery得到的编辑方法你的代码很混乱。在学生和科目已知的情况下,是否需要为考试添加分数?我猜你不想更改主题的名称,而是选择一个不同的名称?我想你的意思是
@model namespace.ViewModel
,或者是
@using namespace
@model ViewModel
的组合是的,我混淆了语言。多谢各位@彼得:是的,可以。还有一个问题。我怎样才能从中获得下拉列表?我是否需要控制器中传递数据的方法,还是应该只在视图中使用Html.DropDownList?我会在我的
控制器
上创建一个
列表
,并将其发送到
视图
,然后在那里您可以访问它。是关于如何做一个下拉列表的文档,只需按照步骤操作,很简单。这就是我所需要的。我不在名单上。非常感谢。
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);
    }
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, ViewModel model)
{
   (...)
}