Удалить из сеанса в определенной структуре индекса объекта - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть форма, которая добавляет детали счета, как на скриншоте:

enter image description here

В этой форме человек сначала добавляет записи, которые хранятся всеанс через этот код:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(string nameValueInsert, string nameValueSubmit, CreateBillViewModel model, int? Patient_id)
{
    int count = 0;
    var button = nameValueInsert ?? nameValueSubmit;

    if (button == "Insert")
    {
        if (Session["templist"] == null)
        {
            List<PatientViewModel> lst = new List<PatientViewModel>();

            lst.Add(new PatientViewModel()
                    {   Count = count,
                        PatientAppointmentID = Int32.Parse(Request.Form["PatientAppointmentID"]),
                        // BillNo = Request.Form["BillNo"],
                        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()
                    {
                        Count = lst.Count + 1,
                        PatientAppointmentID = Int32.Parse(Request.Form["PatientAppointmentID"]),
                        // BillNo = Request.Form["BillNo"],
                        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.BillNo = model.ID;
            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);
        }
    }
}

и после того, как по окончании со всеми записями при отправке все записи сохраняются в базе данных.

Теперь я пытаюсь сделать, если в то время каквводя записи, если пользователь хочет удалить любую строку, он должен иметь возможность удалить ее из сеанса, а после завершения оставшиеся данные должны перейти в БД, для которой я использую следующий подход: Id собирается в контроллер через Ajax-вызов:

  $("body").on("click", "#tblBills .Delete", function () {
        if (confirm("Do you want to delete this row?")) {
            var row = $(this).closest("tr");
            var Id = row.find("span").html();
            console.log("Id");

            $.ajax({
                type: "POST",
                url: "/Session_Delete",
                data: '{ID: ' + Id+ '}',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    alert("hello");
                    $("#test").remove();
                }
            });
        }
    });

и в контроллере я удаляю строку из сеанса следующим образом:

[HttpPost]
public ActionResult DeleteBillSession(int ID)
{
    List<PatientViewModel> lst = (List<PatientViewModel>)Session["templist"];
    lst.Remove(lst.FirstOrDefault(t => t.Count == ID));

    Session["templist"] = lst;

    return Json(new { success = "Valid" }, JsonRequestBehavior.AllowGet);    
}

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

1 Ответ

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

Если кто-то попадает в ту же ситуацию, проблема решается следующим образом:

Просмотр:

<table id="tblBills" class="table table-bordered table-striped table-hover js-basic-example dataTable">
                                    <tr>
                                        <th style="width:100px">Patient Appointmnet ID</th>
                                        <th style="width:100px">Amount</th>
                                        <th style="width:150px">Description</th>
                                        <th style="width:40px">Action</th>
                                    </tr>
                                    @{
                                         double? AmountTotal = 0;
                                        if (Session["templist"] != null)
                                        {
                                            List<PatientViewModel> lst = (List<PatientViewModel>)Session["templist"];
                                            int count = 0;


                                            foreach (var o in lst)
                                            {
                                                <tr>
                                                    <td class="Count" style="display:none">
                                                        <span>@count</span>
                                                    </td>
                                                    <td class="AppointmentID">
                                                        <span>@o.PatientAppointmentID</span>
                                                    </td>
                                                    <td class="Amount">
                                                        <span>@o.Amount</span>
                                                    </td>
                                                    <td class="Description">
                                                        <span>@o.Description</span>
                                                    </td>
                                                    <td>
                                                        <a class="Delete" href="javascript:;">Delete</a>
                                                    </td>
                                                </tr>
                                                AmountTotal += @o.Amount;
                                                count++;
                                            }}
                                        else
                                        {
                                            <tr>
                                                <td colspan="4"> No Data Found</td>
                                            </tr>
                                            }
                                        }
                                    </table>

Ajax Call:

$("body").on("click", "#tblBills .Delete", function () {
        if (confirm("Do you want to delete this row?")) {
            var row = $(this).closest("tr");
            var id= row.find("span").html();
            $.ajax({
                type: "POST",
                url: "/Session_Delete",
                data: '{ID: ' + id+ '}',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    $("#tblBills").load(window.location + " #tblBills");
                }
            });
        }
    });

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

 [HttpPost]
        public ActionResult DeleteBillSession(int ID)
        {
            List<PatientViewModel> lst = (List<PatientViewModel>)Session["templist"];
            lst.RemoveAt(ID);
            Session["templist"] = lst;
           // return new EmptyResult();
             return Json(new { success = "Valid" }, JsonRequestBehavior.AllowGet);
        }
...