【问题标题】:Passing multiple forms from View to Controller in ASP.NET MVC在 ASP.NET MVC 中将多个表单从视图传递到控制器
【发布时间】:2019-01-11 16:45:01
【问题描述】:

我正在创建一个应用程序来预订酒店客房的客人。在 HttpGet 中,我将 ReservationViewModel 从控制器传递到视图。这个虚拟机包含所有的预订细节和 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);
    }

还有我的填写表格:

Form

现在我想知道如何将所有 forminfo 传递给我的 Controller 并使用该信息来保存 Reservation 和每个 Guest,以便我可以将其写入我的数据库。

谢谢!

编辑:我尝试了给出的解决方案,但我似乎无法在我的数据库中获取访客信息。问题似乎是,当它到达 foreach 循环以让客人离开 reservationVM 时,它是空的。每当它进入循环时尝试写入调试输出,但它永远不会。这是我的代码

[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);
    }

【问题讨论】:

  • 欢迎来到 StackOverflow。我只是想说你在写第一个问题时做得很好——希望你能找到答案并享受社区!
  • @Luuk Pook,想看看你的观点!
  • 是的,已发布!它在图片中
  • 您错过了图片中视图的using namespaces 部分。包括using namespaces 部分
  • 我的错.. 已编辑。

标签: c# asp.net-mvc


【解决方案1】:

您正在将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);
}

【讨论】:

  • 哦,这似乎很容易..我会尝试一下。我会告诉你。谢谢!
【解决方案2】:

要在您发布操作中获取您的客人信息,您需要使客人字段如下:

@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)
}

尝试像上面的代码一样在剃刀视图中制作字段..它会起作用。

【讨论】:

  • 嘿,我的数据库中仍然没有我的客人...这是代码示例@for(var i = 0; i &lt; @Model.guests.Count; i++) { @Html.ValidationSummary(true, "", new { @class = "text-danger" }) &lt;div class="form-group"&gt; @Html.LabelFor(model =&gt; model.guests[i].ID, "ID:", htmlAttributes: new { @class = "control-label col-md-2" }) &lt;div class="col-md-10"&gt; @Html.EditorFor(model =&gt; model.guests[i].ID, new { htmlAttributes = new { @class = "form-control" } })
  • 那段代码的格式很糟糕,希望你能弄清楚我做了什么。
猜你喜欢
  • 2016-08-21
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多