簡體   English   中英

ASP.NET Core:問題綁定模型到多個選擇列表

[英]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的模式,改變的類型ReferralConsultantsICollection<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM