c# - ASP.NET Core:将模型绑定到多个选择列表的问题
问题描述
我有一个 Web 应用程序,我在其中处理相关数据,我创建了一个推荐实体,其中包含其他属性之间的患者、请求者和此推荐的不同顾问。我还有 Patient、Requester 和 Consultant 模型。
我已经能够为患者和请求者使用选择列表,他们与推荐实体具有 1:n 的关系。但是,我遇到了顾问问题,因为他们有 n:m 关系而我正在失去它。
这是引用控制器的 [get] Edit 操作。
var referral = await _context.Referral
.Include(r => r.Patient)
.Include(r => r.Requester)
.Include(r => r.ReferralConsultants)
.ThenInclude(r => r.Consultant)
.AsNoTracking()
.FirstOrDefaultAsync(r => r.ID == id);
if (referral == null)
{
return NotFound();
}
ViewData["Patients"] = new SelectList(_context.Patient, "ID", "FullName", referral.PatientID);
ViewData["Requesters"] = new SelectList(_context.Requester, "ID", "FullName", referral.RequesterID);
var consultants = from c in _context.Consultant
select new
{
ConsultantID = c.ID,
c.FullName
};
ViewData["Consultants"] = new MultiSelectList(consultants, "ConsultantID", "FullName", referral.ReferralConsultants);
return View(referral);
这是我的观点
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="ID" />
<div class="form-group">
<h3>Patient Information</h3>
<label asp-for="PatientID" class="control-label">Patient</label>
<select asp-for="PatientID" class="form-control" asp-items="ViewBag.Patients"></select>
<span asp-validation-for="PatientID" class="text-danger"></span>
</div>
<div class="form-group">
<h3>Requester Information</h3>
<label asp-for="RequesterID" class="control-label">Requester</label>
<select asp-for="RequesterID" class="form-control" asp-items="ViewBag.Requesters"></select>
<span asp-validation-for="RequesterID" class="text-danger"></span>
</div>
....
<div class="form-group">
<label asp-for="ReferralConsultants" class="control-label">Consultants</label>
<select asp-for="ReferralConsultants" class="form-control" asp-items="ViewBag.Consultants"></select>
<span asp-validation-for="ReferralConsultants" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
这是 [post] 编辑操作
public async Task<IActionResult> Edit(int id, [Bind("ID,PatientID,RequesterID,DateIssued,DateRequested,Description,Type,ReferralConsultants")] Referral referral)
{
if (id != referral.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(referral);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ReferralExists(referral.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
这些是模型:
public class Referral
{
public int ID { get; set; }
public int PatientID { get; set; }
public int RequesterID { get; set; }
....
public Patient Patient { get; set; }
public Requester Requester { get; set; }
public ICollection<ReferralConsultant> ReferralConsultants { get; set; }
}
public class ReferralConsultant
{
[Key]
public int ConsultantID { get; set; }
[Key]
public int ReferralID { get; set; }
public Referral Referral { get; set; }
public Consultant Consultant { get; set; }
}
public class Consultant : Person
{
public string Title { get; set; }
public ICollection<ReferralConsultant> ReferralConsultants { get; set; }
}
public class Patient : Person
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int PatientID { get; set; }
...
public ICollection<Referral> Referrals { get; set; }
}
我唯一缺少的是能够知道当我在 [post] Edit 操作中选择了哪些顾问。
解决方案
在Referral
模型中,将类型更改ReferralConsultants
为ICollection<int>
(或任何类型Consultant.ID
),对于选择元素,只有值(ConsultantID
在这种情况下)包含在表单提交中。如果您在浏览器中检查生成的视图源,这一点就很清楚了。有关更多信息,请参阅文档。
推荐阅读
- python - How to change the lower case to upper case with conditional specific string in python
- salesforce - Salesforce 中的动态映射 - 生成调用第三方 API 的 JSON 请求
- python - python子进程找不到现有的dll
- flutter - 有没有办法在 Flutter WebView 中导入外部脚本
- python - 如何使用 Python 删除文件夹中除最后 5 个项目之外的所有文件
- sql-server - SQL按固定长度拆分逗号分隔的字符串
- 2checkout - 2Checkout 2pay.js 和测试模式下的令牌?
- java - 使用 ArrayList 和 compareTo 对文件的结果进行排序
- vb.net - 我如何确定任何可能的申请表是否有效?
- java - 如何在 java customobject 中为 firestore 使用地图