imgeorger Ответов: 1

Заполнение выпадающего списка из базы данных


У меня есть форма с выпадающим списком "MsgType", которая будет извлекать свой вариант из таблицы базы данных "DDLMsgType".

Веб-форма создается путем построения каркасов модели ContactRecord, которые также содержат MsgType.

Я попытался заполнить MsgType в форму MsgType, но мой код не работает. Я хотел бы спросить, что я пропустил. Спасибо.

<div class="form-group">
             <label asp-for="MsgType" class="control-label"></label>
             <select asp-for="MsgType" asp-items="Model.MsgTypeSL" class="form-control" />
             <span asp-validation-for="MsgType" class="text-danger"></span>
         </div>


Что я уже пробовал:

DDLMsgType.в CS
public class DDLMsgType
       {
           public int MsgTypeID { get; set; }
           public string MsgType { get; set; }
           public string MsgTypeStatus { get; set; }

       }


ContactRecord.в CS
public partial class ContactRecord
    {
        public long ContactId { get; set; }

        [Required(ErrorMessage = "Please enter your name."), MaxLength(50)]
        [Display(Name = "Name")]
        public string SenderName { get; set; }
        [Required(ErrorMessage = "Please select the Message Type")]
        [Display(Name = "Message Type")]
        public string MsgType { get; set; }
public SelectList MsgTypeSL { get; set; }



public class ContactRecordsController : Controller
    {
        private readonly theManagerContext _context;

        public ContactRecordsController(theManagerContext context)
        {
            _context = context;
        }

        // GET: ContactRecords
        public async Task<IActionResult> Index()
        {
            return View(await _context.ContactRecord.ToListAsync());
        }

        private void PopulateMsgTypes(object selectedMsgType=null)
        {
            var MsgTypeQuery = from p in _context.DDLMsgType
                                orderby p.MsgType
                                select p;
            
        }

     
        // GET: ContactRecords/Create
        public IActionResult Create()
        {
            return View();
        }

        // POST: ContactRecords/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("ContactId,SenderName,MsgType,Subject,Email,ContactNo,CreateTime,FollowedUpBy,Status")] ContactRecord contactRecord)
        {
            if (ModelState.IsValid)
            {
                _context.Add(contactRecord);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }

            return View(contactRecord);
        }

        // GET: ContactRecords/Edit/5
        public async Task<IActionResult> Edit(long? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var contactRecord = await _context.ContactRecord.FindAsync(id);
            if (contactRecord == null)
            {
                return NotFound();
            }
            PopulateMsgTypes("MsgType");
            return View(contactRecord);
        }

ZurdoDev

Я не понимаю, о чем вы нас спрашиваете.

1 Ответов

Рейтинг:
0

Richard Deeming

Прежде всего, не добавляйте SelectList к вашей сущности базы данных. В лучшем случае он будет проигнорирован; в противном случае он будет генерировать ошибки, потому что Entity Framework не понимает, как его хранить или загружать.

Я бы рекомендовал использовать модель представления в качестве модели для вашего представления. Добавить SelectList к виду-модели. Напишите метод для заполнения SelectList, и вызовите его перед отображением вашего представления создания или редактирования.

Сущность базы данных:

public partial class ContactRecord
{
    public long ContactId { get; set; }

    [Required(ErrorMessage = "Please enter your name."), MaxLength(50)]
    [Display(Name = "Name")]
    public string SenderName { get; set; }
    
    [Required(ErrorMessage = "Please select the Message Type")]
    [Display(Name = "Message Type")]
    public string MsgType { get; set; }
}
Модель представления:
public class ContactRecordViewModel
{
    public ContactRecordViewModel(ContactRecord record)
    {
        ContactId = record.ContactId;
        SenderName = record.SenderName;
        MsgType = record.MsgType;
    }
    
    public ContactRecordViewModel()
    {
    }
    
    public long ContactId { get; set; }

    [Required(ErrorMessage = "Please enter your name."), MaxLength(50)]
    [Display(Name = "Name")]
    public string SenderName { get; set; }
    
    [Required(ErrorMessage = "Please select the Message Type")]
    [Display(Name = "Message Type")]
    public string MsgType { get; set; }
    
    public SelectList MsgTypeSL { get; set; }
    
    public void UpdateModel(ContactRecord record)
    {
        record.SenderName = SenderName;
        record.MsgType = MsgType;
    }
}
Контроллер:
private async Task PopulateLookups(ContactRecordViewModel model)
{
    var msgTypes = _context.DDLMsgType.OrderBy(p => p.MsgType).ToListAsync();
    model.MsgTypeSL = new SelectList(msgTypes, nameof(DDLMsgType.MsgType), nameof(DDLMsgType.MsgType), model.MsgType);
}

[HttpGet]
public async Task<IActionResult> Create()
{
    var model = new ContactRecordViewModel();
    await PopulateLookups(model);
    return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(ContactRecordViewModel model)
{
    if (!ModelState.IsValid)
    {
        await PopulateLookups(model);
        return View(model);
    }
    
    var record = new ContactRecord();
    model.UpdateModel(record);
    _context.ContactRecord.Add(record);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}

[HttpGet]
public async Task<IActionResult> Edit(long id)
{
    var record = await _context.ContactRecord.FindAsync(id);
    if (record is null) return NotFound();
    
    var model = new ContactRecordViewModel(record);
    await PopulateLookups(model);
    return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(ContactRecordViewModel model)
{
    var record = await _context.ContactRecord.FindAsync(model.ContactId);
    if (record is null) return NotFound();
    
    if (!ModelState.IsValid)
    {
        await PopulateLookups(model);
        return View(model);
    }
    
    model.UpdateModel(record);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}

NB: Основываясь на вашем DDLMsgType сущность, она выглядит как MsgType недвижимость в вашем доме ContactRecord вероятно, это должен быть Ан int ссылка на сайт MsgTypeID. В этом случае вам нужно будет изменить модель представления, чтобы она соответствовала, и изменить dataValueField параметр к SelectList конструктор.