: «Элемент ViewData, имеющий ключ« PatientAppointmentID », имеет тип« System.Int32 », но должен иметь тип« IEnumerable <SelectListItem>». ' - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть от, в котором есть выпадающий список

 @Html.DropDownListFor(m => m.PatientAppointmentID, ViewBag.AppointmentDate as List<SelectListItem>," - Select Appointment Date -",new { @class = "form-control" })

Метод контроллера для него:

public ActionResult Create(int? Patient_id)
{
    CreateBillViewModel model = new CreateBillViewModel();
    if (Patient_id != null)
    {
        List<SelectListItem> AppointmentDates = (from p in db.tblPatientAppointments
                                                 where p.patient_id == Patient_id
                                                 select new SelectListItem
                                                 {
                                                     Text = p.AppointmentDate,
                                                     Value = p.ID.ToString()
                                                 }).ToList();
        ViewBag.AppointmentDate = AppointmentDates;
    }
    return View(model);
}

Он правильно заполняет значения в выпадающем списке, но когда язаполните форму и выберите значение в раскрывающемся списке, в котором выдается следующая ошибка:

System.InvalidOperationException: «Элемент ViewData, имеющий ключ« PatientAppointmentID », имеет тип« System.Int32 », нодолжен иметь тип 'IEnumerable'. '

Далее при отправке формы значения сохраняются в сеансе, как указано ниже, я также хочу сохранить выпадающий список и идентификатор пациента в URL для дальнейшего использования.значения, которые я хочу добавить в сеанс

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(string nameValueInsert, string nameValueSubmit, CreateBillViewModel model)
{
    var button = nameValueInsert ?? nameValueSubmit;
    if (button == "Insert")
    {
        if (Session["templist"] == null)
        {

            List<PatientViewModel> lst = new List<PatientViewModel>();

            lst.Add(new PatientViewModel()
            {
                PatientAppointmentID = Int32.Parse(Request.Form["PatientAppointmentID"]),
                                        Amount = double.Parse(Request.Form["Amount"]),
                Description = Request.Form["Description"]
            });
            Session["templist"] = lst;
        }
        else
        {
            List<PatientViewModel> lst = (List<PatientViewModel>)Session["templist"];

            lst.Add(new PatientViewModel()
            {
                PatientAppointmentID = Int32.Parse(Request.Form["PatientAppointmentID"]),
                                        Amount = double.Parse(Request.Form["Amount"]),
                Description = Request.Form["Description"]
            });
            Session["templist"] = lst;
        }
    }
    else
    {
        if (ModelState.IsValid)
        {
            string username = "";
            HttpCookie cookie = HttpContext.Request.Cookies["AdminCookies"];
            if (cookie != null)
            {
                username = Convert.ToString(cookie.Values["UserName"]);
            }
            tblPatientBill patientbill = new tblPatientBill();
            patientbill.PatientAppointmentID = model.PatientAppointmentID;
            patientbill.Amount = model.AmountTotal;
            patientbill.Description = model.Note;
            patientbill.Discount = model.Discount;
            patientbill.CreatedAt = model.CreatedAt;
            patientbill.CreatedBy = username;
            patientbill.is_active = true;
            db.tblPatientBills.Add(patientbill);
            db.SaveChanges();

            int PatientBill_ID = Convert.ToInt32(patientbill.ID);
            List<PatientViewModel> lst = (List<PatientViewModel>)Session["templist"];
            if (lst != null)
            {
                tblPatientBillDetail billdetail = new tblPatientBillDetail();
                foreach (var item in lst)
                {
                    billdetail.PatientBillID = PatientBill_ID;
                    billdetail.Amount = item.Amount;
                    billdetail.CreatedAt = DateTime.UtcNow;
                    billdetail.CreatedBy = username;
                    billdetail.Description = item.Description;
                    billdetail.is_active = true;
                    db.tblPatientBillDetails.Add(billdetail);
                    db.SaveChanges();
                }
                Session.Clear();
            }
            return RedirectToAction("Print", new { Billid = @PatientBill_ID });
        }
    }
    return View(model);
}

1 Ответ

0 голосов
/ 25 сентября 2019

Решение этой проблемы приведено ниже, если кто-то еще попадет в ту же ситуацию: В ViewModel создайте свойства для выпадающего списка, чтобы извлечь значения из базы данных и отправить выбранное значение в db.

CreateBillViewModel:

public class CreateBillViewModel
{
-------- --------
public IEnumerable<SelectListItem> PatientAppointmentDate { get; set; }
public int PatientAppointmentID { get; set; }
-------- --------
}

В Контроллере :

  public ActionResult Create(int? Patient_id)
  {
  CreateBillViewModel model = new CreateBillViewModel();
  if (Patient_id != null)
  {
  model.PatientAppointmentDate = (from p in db.tblPatientAppointments
  where p.patient_id == Patient_id
  select new SelectListItem
  {
  Text = p.AppointmentDate,
  Value = p.ID.ToString()
  }).ToList();
  }
  return View(model);
  }

Получить его в виде, подобном этому:

Представление:

@Html.DropDownListFor(m => m.PatientAppointmentID, Model.PatientAppointmentDate ?? new List<SelectListItem>(), "- Select Appointment Date - ", new { @class = "form-control" })

После отправки формы, если вы хотите, чтобы одна и та же страница открывалась и в раскрывающемся списке были те же значения, что и в HTTPPOST, отправьте ее обратно следующим образом.

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateBillViewModel model, int? Patient_id)
{
if (ModelState.IsValid)
{
//Save into db
}
model.PatientAppointmentDate = (from p in db.tblPatientAppointments
where p.patient_id == Patient_id
select new SelectListItem
{
Text = p.AppointmentDate,
Value = p.ID.ToString()
}).ToList();
}
return View(model);
}

Вот так и была решена моя проблема. Для более подробной информации можно сослаться на эту ссылку: ThisLink

...