在 DropdownListFor 上显示 FullName 但提交 Id - ASP.NET MVC C#
Display FullName on DropdownListFor but submit Id - ASP.NET MVC C#
我正在尝试构建一个表格以获取有关即将举行的考试的信息。我的计划是制作一个下拉列表,显示可供选择的教师列表以及谁将负责考试。
这是我的模型的简化版本:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
public class Teacher
{
public int Id { get; set; }
public int PersonId { get; set; }
public Person Person { get; set; }
}
public class Exam
{
public int Id { get; set; }
public string Subject { get; set; }
public DateTime ExamDate { get; set; }
public int TeacherId { get; set; }
public Teacher Teacher { get; set; }
}
我的视图模型:
public class ExamViewModel
{
public Exam Exam { get; set; }
public IEnumerable<Person> People { get; set; }
public IEnumerable<Teacher> Teachers { get; set; }
}
我的 Create
动作来自 ExamController
:
public ActionResult Create()
{
var people = _context.People.ToList();
var teachers = _context.Teachers.ToList();
var viewModel = new ExamViewModel
{
People = people,
Teachers = teachers,
};
return View(viewModel);
}
我想在上述下拉列表中显示所有教师的 People.Firstname + " " + People.Surname
,但我不想提交 People.Id
,而是想提交 Teachers.Id
到 Exams.TeacherId
我首先尝试显示所有 FirstName
的列表,然后在我的 [=17= 中尝试使用以下剃须刀 html 助手显示 FirstName
和 Surname
] 查看,但我在那里已经失败了,因为我只能从一个 class (Teachers
) 访问属性,使用的是 dataValueField
和 dataTextField
for new SelectList()
:
<h2>Plan exam</h2>
@using (Html.BeginForm("Create", "ExamController"))
{
<div class="form-floating mb-3">
@Html.DropDownListFor(m => m.Exam.TeacherId, new SelectList(Model.Teachers, "Id", "FirstName"), "-- Please select --", new { @class = "form-control", @placeholder = "Teacher" })
@Html.LabelFor(m => m.Exam.TeacherId)
</div>
}
我对编程还很陌生,所以我将非常感谢任何形式的帮助。
在您的 viewModel 中,您只能发送 Exams ,但是在获取考试的查询中,您必须进行连接以获取每个考试的 teacherID 、 teacherName 、 teacherSubname 、
了解那个检查这个:
或这个 :
here
另一件事,在您的模型 (类) 定义中,我认为您必须添加 Exam 和 Teacher 之间以及 Teacher 和 People 之间的关系,如果您这样做,将更容易仅获取必要的数据,并且您将在 viewModel 中仅使用一个 属性(考试)将数据发送到视图,为此请检查此 here
我找到了解决方案:
- 首先,我创建了第二个 ViewModel,其中 属性
Id
用于 Teacher.Id
和 FullName
用于 Person.FirstName + " " + Person.Surname
:
public class TeacherViewModel
{
public int Id { get; set; }
public string FullName { get ; set; }
}
- 然后我从我的 ExamViewModel 中删除了不必要的
IEnumerable<Person> People
,并为类型 TeacherViewModel
: 的 Teachers
添加了一个 IEnumerable<>
public class ExamViewModel
{
public Exam Exam { get; set; }
public IEnumerable<TeacherViewModel> Teachers { get; set; }
}
- 我在步骤 1 中创建了一个连接,并将其转换为新
TeacherViewModel
中的列表:
public ActionResult Create()
{
var teachers = (from t in _context.Teachers
join p in _context.People
on t.PersonId equals p.Id
select new TeacherViewModel
{
Id = t.Id,
FullName = p.FirstName + " " + p.Surname,
}).ToList();
var viewModel = new ExamViewModel
{
Teachers = teachers,
};
return View(viewModel);
}
- 我给控制器添加了一个
Save()
方法:
public ActionResult Save(Exams exam)
{
_context.Exams.Add(exam);
_context.SaveChanges();
return RedirectToAction("Create", "Exams");
}
- 将提交按钮添加到视图并将
Html.BeginForm(
旁边的操作名称更改为 Save
,因为它将处理从表单保存变量。
@using (Html.BeginForm("Save", "Exams"))
{
<div class="form-floating mb-3">
@Html.DropDownListFor(m => m.Exam.TeacherId, new SelectList(Model.Teachers, "Id", "FullName"), "-- please select --", new { @class = "form-control", @placeholder = "Teacher" })
@Html.LabelFor(m => m.Exam.TeacherId)
</div>
<button type="submit" class="btn btn-primary">Submit</button>
}
我正在尝试构建一个表格以获取有关即将举行的考试的信息。我的计划是制作一个下拉列表,显示可供选择的教师列表以及谁将负责考试。
这是我的模型的简化版本:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
}
public class Teacher
{
public int Id { get; set; }
public int PersonId { get; set; }
public Person Person { get; set; }
}
public class Exam
{
public int Id { get; set; }
public string Subject { get; set; }
public DateTime ExamDate { get; set; }
public int TeacherId { get; set; }
public Teacher Teacher { get; set; }
}
我的视图模型:
public class ExamViewModel
{
public Exam Exam { get; set; }
public IEnumerable<Person> People { get; set; }
public IEnumerable<Teacher> Teachers { get; set; }
}
我的 Create
动作来自 ExamController
:
public ActionResult Create()
{
var people = _context.People.ToList();
var teachers = _context.Teachers.ToList();
var viewModel = new ExamViewModel
{
People = people,
Teachers = teachers,
};
return View(viewModel);
}
我想在上述下拉列表中显示所有教师的 People.Firstname + " " + People.Surname
,但我不想提交 People.Id
,而是想提交 Teachers.Id
到 Exams.TeacherId
我首先尝试显示所有 FirstName
的列表,然后在我的 [=17= 中尝试使用以下剃须刀 html 助手显示 FirstName
和 Surname
] 查看,但我在那里已经失败了,因为我只能从一个 class (Teachers
) 访问属性,使用的是 dataValueField
和 dataTextField
for new SelectList()
:
<h2>Plan exam</h2>
@using (Html.BeginForm("Create", "ExamController"))
{
<div class="form-floating mb-3">
@Html.DropDownListFor(m => m.Exam.TeacherId, new SelectList(Model.Teachers, "Id", "FirstName"), "-- Please select --", new { @class = "form-control", @placeholder = "Teacher" })
@Html.LabelFor(m => m.Exam.TeacherId)
</div>
}
我对编程还很陌生,所以我将非常感谢任何形式的帮助。
在您的 viewModel 中,您只能发送 Exams ,但是在获取考试的查询中,您必须进行连接以获取每个考试的 teacherID 、 teacherName 、 teacherSubname 、
了解那个检查这个:
另一件事,在您的模型 (类) 定义中,我认为您必须添加 Exam 和 Teacher 之间以及 Teacher 和 People 之间的关系,如果您这样做,将更容易仅获取必要的数据,并且您将在 viewModel 中仅使用一个 属性(考试)将数据发送到视图,为此请检查此 here
我找到了解决方案:
- 首先,我创建了第二个 ViewModel,其中 属性
Id
用于Teacher.Id
和FullName
用于Person.FirstName + " " + Person.Surname
:
public class TeacherViewModel
{
public int Id { get; set; }
public string FullName { get ; set; }
}
- 然后我从我的 ExamViewModel 中删除了不必要的
IEnumerable<Person> People
,并为类型TeacherViewModel
: 的
Teachers
添加了一个 IEnumerable<>
public class ExamViewModel
{
public Exam Exam { get; set; }
public IEnumerable<TeacherViewModel> Teachers { get; set; }
}
- 我在步骤 1 中创建了一个连接,并将其转换为新
TeacherViewModel
中的列表:
public ActionResult Create()
{
var teachers = (from t in _context.Teachers
join p in _context.People
on t.PersonId equals p.Id
select new TeacherViewModel
{
Id = t.Id,
FullName = p.FirstName + " " + p.Surname,
}).ToList();
var viewModel = new ExamViewModel
{
Teachers = teachers,
};
return View(viewModel);
}
- 我给控制器添加了一个
Save()
方法:
public ActionResult Save(Exams exam)
{
_context.Exams.Add(exam);
_context.SaveChanges();
return RedirectToAction("Create", "Exams");
}
- 将提交按钮添加到视图并将
Html.BeginForm(
旁边的操作名称更改为Save
,因为它将处理从表单保存变量。
@using (Html.BeginForm("Save", "Exams"))
{
<div class="form-floating mb-3">
@Html.DropDownListFor(m => m.Exam.TeacherId, new SelectList(Model.Teachers, "Id", "FullName"), "-- please select --", new { @class = "form-control", @placeholder = "Teacher" })
@Html.LabelFor(m => m.Exam.TeacherId)
</div>
<button type="submit" class="btn btn-primary">Submit</button>
}