[英]ASP.NET Core: Problem binding model to a multiple Select List
我有一個用於處理相關數據的Web應用程序,創建了一個轉診實體,該轉診實體在其他屬性之間包含患者,請求者和該轉診的其他顧問。 我也有耐心,請求者和顧問模型。
我已經能夠使用“患者”和“請求者”的選擇列表,它們與“轉診”實體具有1:n的關系。 但是,我在顧問方面遇到了問題,因為他們之間存在n:m關系,我正在使用多個列表,因此我可以顯示我的顧問列表並選擇多個列表,但是當我發布數據時,它並沒有綁定到ReferralConsultants而我正在失去它。
這是引用控制器的[get]編輯操作。
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>
這是[發布]編輯操作
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]編輯操作中時,能夠知道選擇了哪些顧問。
在該Referral
的模式,改變的類型ReferralConsultants
到ICollection<int>
(或任何的類型Consultant.ID
是),作為用於選擇元素只的值( ConsultantID
在這種情況下)被包含在表單提交。 如果您在瀏覽器中檢查生成的視圖源,這一點將變得很清楚。 有關更多信息,請參閱文檔 。
我終於通過以下方法解決了這個問題:
我創建MultiSelectList項目,並將其發送到這樣的視圖。
ReferralsController.cs
var consultants = from c in _context.Consultant
select new
{
ConsultantID = c.ID,
c.FullName
};
ViewData["Consultants"] = new MultiSelectList(consultants, "ConsultantID", "FullName", referral.ReferralConsultants.Select(r => r.ConsultantID).ToArray());
return View(referral);
在視圖中
<div class="form-group">
<label class="control-label d-inline">
Consultants
<select multiple name="selectedValues" class="form-control" asp-items="ViewBag.Consultants"></select>
</label>
</div>
當我提交表單時,這會將selectedValues發送到我的控制器。 然后,我只需要在Edit [Post]中獲取這些值,然后將它們保存在數據庫中即可。
public async Task<IActionResult> Edit(int id, [Bind("ID,PatientID,RequesterID,DateIssued,DateRequested,Description,Type, Status")] Referral referral, string [] selectedValues)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.