首页 > 解决方案 > 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 操作中选择了哪些顾问。

标签: c#asp.net-core

解决方案


Referral模型中,将类型更改ReferralConsultantsICollection<int>(或任何类型Consultant.ID),对于选择元素,只有值(ConsultantID在这种情况下)包含在表单提交中。如果您在浏览器中检查生成的视图源,这一点就很清楚了。有关更多信息,请参阅文档


推荐阅读