0

我只是 C#、MVC4、razor 和 Linq 的初级程序员。现在我正忙着为一个不存在的酒店构建一个应用程序。并且该应用程序几乎可以正常工作。但是有一个小错误。当我创建预订时,我想将房间和客人列表<>链接到预订。但是每次我创建一个新的预订时,都会在数据库中创建一个新的房间,除了 id 之外一切都是一样的。对于客人来说也是一样的,如果我创建一个新的预订,客人也会在数据库中创建并且不链接到预订。我已经使用了调试器和对象 Room,并且列表完美地传递给了预订的创建。所以在我的预订创建方法中一定有问题。我无法找出我的 Create 方法有什么问题。所以我希望能在这里找到一些帮助。

其他信息: TempStore 是一个静态类,我在其中临时保存了一些变量。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Booking booking)
    {
        if (ModelState.IsValid)
        {
            if (TempStore.tempGuests.Count == 0 || TempStore.tempRoom == null)
            {
                ModelState.AddModelError("NoGuestsSelected", "Please select the persons for your room.");
                ModelState.AddModelError("NoRoomSelected", "Please select a room for your booking.");
                return View();
            }
            else
            {
                booking.Room = TempStore.tempRoom;
                booking.Guests = TempStore.tempGuests;
                booking.PriceTotal = TempStore.priceTotal;
                booking.AveragePrice = TempStore.averagePrice;
                booking.StartDate = TempStore.startDate;
                booking.EndDate = TempStore.endDate;

                db.Bookings.Add(booking);
                db.SaveChanges();

                //Clearing the TempStore cause everything has been added
                TempStore.tempGuests.Clear();
                TempStore.tempRoom = null;

                return RedirectToAction("Index");
            }
        }

        return View(booking);
    }

这是我的临时商店

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Hotel.Models
{
    public static class TempStore
    {
        public static Room tempRoom;
        public static ICollection<Guest> tempGuests = new List<Guest>();
        public static DateTime startDate;
        public static DateTime endDate;
        public static decimal priceTotal;
        public static decimal averagePrice;
    }
}

这是我设置我的客人的地方

    public ActionResult AddGuest(int id)
    {
        Guest g = db.Guests.Find(id);

        if (TempStore.tempGuests.Count != 0)
        {
            foreach (Guest gue in TempStore.tempGuests)
            {
                if (gue == g)
                {
                    ModelState.AddModelError("DuplicateGuest", "Cannot select the same guest twice.");
                    return RedirectToAction("SelectGuest");
                }
            }
        }

        TempStore.tempGuests.Add(g);

        return RedirectToAction("SelectGuest");
    }

这是我为预订设置房间的地方:

    public ActionResult AddRoom(int id)
    {
        Room r = db.Rooms.Find(id);
        TempStore.tempRoom = r;
        return RedirectToAction("SelectGuest");
    }
4

2 回答 2

0

好吧,基本上你必须有一些方法来确定它是重复的。这将取决于您的数据模型,但如果您知道有唯一的字段,您可以在保存新记录之前搜索匹配的记录。

于 2014-10-21T16:59:27.303 回答
0

它可能不是一个整洁的方式。但是我的问题解决了。我要感谢大家的帮助。

这就是我解决它的方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Booking booking)
    {
        if (ModelState.IsValid)
        {
            if (TempStore.tempGuests.Count == 0 || TempStore.tempRoom == null)
            {
                ModelState.AddModelError("NoGuestsSelected", "Please select the persons for your room.");
                ModelState.AddModelError("NoRoomSelected", "Please select a room for your booking.");
                return View();
            }
            else
            {
                booking.PriceTotal = TempStore.priceTotal;
                booking.AveragePrice = TempStore.averagePrice;
                booking.StartDate = TempStore.startDate;
                booking.EndDate = TempStore.endDate;

                db.Bookings.Add(booking);
                db.SaveChanges();

                booking.Guests = new List<Guest>();

                foreach(Guest g in TempStore.tempGuests)
                {
                    db.Bookings.Find(booking.Id).Guests.Add(db.Guests.Find(g.Id));
                }

                db.Bookings.Find(booking.Id).Room = db.Rooms.Find(TempStore.tempRoom.Id);
                db.Entry(booking).State = EntityState.Modified;
                db.SaveChanges();

                //Clearing the TempStore cause everything has been added
                TempStore.tempGuests.Clear();
                TempStore.tempRoom = null;

                return RedirectToAction("Index");
            }
        }

        return View(booking);
    }
于 2014-10-22T08:36:00.457 回答