簡體   English   中英

在ASP.NET MVC中將多種表單從視圖傳遞到控制器

[英]Passing multiple forms from View to Controller in ASP.NET MVC

我正在創建一個預訂酒店房間客人的應用程序。 在HttpGet中,我將ReservationViewModel從我的控制器傳遞到視圖。 該VM包含所有reservationdetails和2個空的Guest對象(或很多)。 對於每個Guest對象,我顯示一個表單,用戶需要在其中輸入有關Guest的信息。 但是,當我嘗試提交時,它僅返回一位來賓的信息。 我試圖尋找一種方法來傳遞一個數組或多個來賓,但這似乎是不可能的,僅發送帶有參數的來賓對象似乎可行。

這是我的GET的代碼:

[HttpGet]
    public ActionResult Edit2(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Reservation reservation = resRepo.GetReservationByID(id);
        ReservationVM reservationVM = new ReservationVM(0);

        for (int i = 0; i < reservation.amount_people; i++)
        {
            reservationVM.guests.Add(new Guest());
        }

        foreach(Guest guest in reservationVM.guests)
        {
            guest.name = " ";
            guest.zipcode = " ";
            guest.housenumber = 0;
            guest.suffix = "";
            guest.email = " ";
            guestRepo.AddGuest(guest);
        }
        guestRepo.Save();

        reservationVM.date = (DateTime)reservation.date;
        reservationVM.amount_people = (int)reservation.amount_people;
        reservationVM.ID = reservation.ID;
        reservationVM.room_ID = (int)reservation.room_ID;

        if (reservation == null)
        {
            return HttpNotFound();
        }
        return View(reservationVM);
    }

和我的帖子:

[HttpPost]
    public ActionResult Edit2([Bind(Include = "room_ID,date,amount_people,ID")]Reservation reservation, [Bind(Include = "ID,name,zipcode,housenumber,suffix,email")]Guest guest)
    {
        if (ModelState.IsValid)
        {
            resRepo.UpdateReservation(reservation);
            resRepo.Save();
            guestRepo.UpdateGuest(guest);
            guestRepo.Save();

            Reservation r = new Reservation { ID = reservation.ID };
            db.Reservations.Add(r);
            db.Reservations.Attach(r);

            Guest g = new Guest { ID = guest.ID };
            db.Guests.Add(g);
            db.Guests.Attach(g);

            r.Guests.Add(g);

            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(reservation);
    }

和我的填寫表格:

形成

現在,我想知道如何將所有forminfo傳遞給我的Controller並使用該信息來保存Reservation和每個Guest,以便可以將其寫入數據庫。

謝謝!

編輯:我嘗試了給定的解決方案,但似乎無法在數據庫中獲取來賓信息。 問題似乎是,當到達foreach循環以使guest虛擬機脫離ReservationVM時,它為空。 嘗試在每次進入循環時都寫入Debug輸出,但從未嘗試過。 這是我的代碼

[HttpPost]
    public ActionResult Edit2(ReservationVM reservationVM)
    {
        if (ModelState.IsValid)
        {
            //Get reservation
            Reservation reservation = resRepo.GetReservationByID(reservationVM.ID);
            //Update values in model 
            reservation.date = reservationVM.date;
            reservation.amount_people = reservationVM.amount_people;
            reservation.ID = reservationVM.ID;
            reservation.room_ID = reservationVM.room_ID;
            //Update to DB and save changes
            resRepo.UpdateReservation(reservation);
            resRepo.Save();

            foreach (Guest guest in reservationVM.guests)
            {
                Guest temp = guestRepo.GetGuestByID(guest.ID);

                temp.name = guest.name;
                temp.zipcode = guest.zipcode;
                temp.housenumber = guest.housenumber;
                temp.suffix = guest.suffix;
                temp.email = guest.email;
                temp.ID = guest.ID;

                guestRepo.UpdateGuest(temp);
                reservation.Guests.Add(temp);
            }
            guestRepo.Save();

            //Reservation r = new Reservation { ID = reservation.ID };
            //db.Reservations.Add(r);
            //db.Reservations.Attach(r);

            //Guest g = new Guest { ID = guest.ID };
            //db.Guests.Add(g);
            //db.Guests.Attach(g);

            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(reservationVM);
    }

您正在將ReservationVM從視圖傳遞到post方法。 因此,如下編寫您的post方法:

[HttpPost]
public ActionResult Edit2(ReservationVM reservationVM)
{
    if (ModelState.IsValid)
    {
        // Here access the necessary values you need from `reservationVM` and do your necessary stuffs

        return RedirectToAction("Index");
    }
    return View(reservation);
}

要在發布操作中獲取來賓信息,您需要按照以下步驟設置來賓字段:

@for(var i = 0; i < Model.guests.count; i++)
{
   Your editor will be like below 

    @Html.EditorFor(model => model.guests[i].ID)

    @Html.EditorFor(model => model.guests[i].name)
}

嘗試像上面的代碼那樣在razor視圖中創建字段。它會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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