在数据库中存储下拉选项值?

时间:2015-04-11 09:43:54

标签: c# sql database asp.net-mvc-4 razor

我在ASP.NET MVC4中有一个虚构的网站,旨在模拟私人飞机租赁公司的机票预订系统。但是,在实现我想要的功能时,我正在努力,其中一个是使用下拉菜单将数据存储到另一个数据库


让您更好地了解我的目标

  • 用户登录网站
  • 转到航班页面
  • 查看航班
  • 最后进入预订页面

然后

  • 从下拉菜单中选择所需的航班
  • 输入他们想要购买的门票数量。 (下拉列表正在运行但未执行重置)
  • 然后,用户数据库应检查用户的年龄(已经是) 存储在数据库中)介于18和64之间
    • 如果它们超出该范围,则应显示错误消息 并阻止他们预订机票。
    • 如果他们在这个范围内,剩下的座位数应减少“购买”的票数

另外

  • 如果用户尚未登录,预订页面应提示用户登录。

这让我感到非常困惑。

我有两个与航班相关的页面:

解决方案资源管理器中项目文件的屏幕截图

enter image description here

以下是与航班表相关的相关文件(第1页)

https://gist.github.com/anonymous/144ed06e1d4f2011161e

第2页从第1页的列表中读取,这是如何完成的:

查看

@model List<Project_v3.Models.FlightsTable>

@{
    ViewBag.Title = "Book Flight | Open Airlines";
    Layout = "~/Views/Shared/_MyLayout.cshtml";
}

<h2>Book A Flight</h2>

    <select id='SelectedFlight' name='SelectedFlight'>
        @foreach (var flight in Model)
        {
            <option value='@flight.FlightID'>@String.Format("{0} to {1}", flight.Departure, flight.Arrival)</option>
        }
    </select>

控制器

    public ActionResult BookFlight()
    {
        using (var context = new FlightsDBEntities())
        {
            // Get all of the flights within your table
            var flights = context.FlightsTables.ToList();

            // Pass the flights to your View
            return View(flights);
        }
    }

我的问题是

如何将下拉菜单中的数据作为另一个名为“Booking”的数据库表中的字段? (我还没有制作这张桌子)。如果这有道理?

如何获取用户选择的信息(来自下拉列表)并按下按钮进行存储?这甚至可能吗?有人能够根据我上面列出的代码向我展示一个有效的例子吗?

1 个答案:

答案 0 :(得分:1)

首先,您必须创建一个模型,您将在其中存储将被选中的项目。

public class BookingModel
{
    public string SelectedFlightId {get;set;}
    public List<SelectListItem> Flights {get;set;}
}

您需要修改使用新模型的Action。

public ActionResult BookFlight()
{
    using (var context = new FlightsDBEntities())
    {
        // Get all of the flights within your table
        var flights = context.FlightsTables.ToList();

        var booking = new BookingModel();
        booking.Flights = flights.Select(f => new SelectListItem
                            {
                                Text = String.Format("{0} to {1}", f.Departure, f.Arrival),
                                Value = f.FlightID.ToString()
                            }).ToList();
        return View(booking);
    }
}

修改视图以使用我们的新模型

@model Project_v3.Models.BookingModel

@{
    ViewBag.Title = "Book Flight | Open Airlines";
    Layout = "~/Views/Shared/_MyLayout.cshtml";
}

<h2>Book A Flight</h2>
@using(Html.BeginForm())
{
    @Html.DropDownListFor(x => x.SelectedFlightId, Model.Flights)
    <input type="submit" value="Submit" />
}

创建一个与第一个操作同名的新Action,但放置HttpPost属性。在此操作中,您将在提交表单后获得SelectedFlightId

[HttpPost]
public ActionResult BookFlight(BookingModel booking)
{

    using (var context = new FlightsDBEntities())
    {

        if(ModelState.IsValid)
        {
            var flightId = Int32.Parse(booking.SelectedFlightId);
            var flight = context.FlightsTables.First(f => f.FlightID == flightId);

            var user = context.UsersTables.First(u => u.UserId == User.Identity.GetUserId());
            user.Flights.Add(flight)
            context.SaveChanges();
        }

        // repopulate again the flights (this can be cached and/or be refactored a under method)
        var flights = context.FlightsTables.ToList();
        booking.Flights = flights.Select(f => new SelectListItem
                            {
                                Text = String.Format("{0} to {1}", f.Departure, f.Arrival),
                                Value = f.FlightID.ToString()
                            }).ToList();
    }
    return View(booking);
}