【问题标题】:Store dropdown option value in database?在数据库中存储下拉选项值?
【发布时间】:2015-04-11 21:52:21
【问题描述】:

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


为了让您更好地了解我的真正目标

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

然后

  • 从下拉菜单中选择他们想要的航班
  • 输入他们要购买的门票数量。 (下拉菜单有效,但未执行重置)
  • 然后用户数据库应该检查用户的年龄(已经 存储在数据库中)在 18 到 64 之间
    • 如果超出该范围,将出现错误消息 并阻止他们订票。
    • 如果在该范围内,剩余座位数量应减少“购买”的门票数量

还有

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

这让我很困惑。

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

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

这是我与航班表相关的相关文件(第 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”的数据库表中的字段? (我还没有制作这张桌子)。如果这有意义吗?

如何获取用户选择的信息(从下拉列表中)并通过按下按钮进行存储?这甚至可能吗?任何人都可以根据我上面列出的代码向我展示一个可行的示例吗?

【问题讨论】:

  • 您将[Authorize] 属性应用于该方法,以确保用户在未经授权的情况下重定向到您的登录页面。您在 GET 方法中检查用户年龄(在显示预订页面之前),如果他们的年龄无效,则重定向到错误页面。使用视图模型和 html 助手来生成您的控件。我强烈建议您访问 MVC 站点并完成基本教程。

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


【解决方案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" />
}

创建一个与第一个动作同名的新动作,但放置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);
}

【讨论】:

  • 您好,感谢您的回复。我遇到了您的解决方案的问题。我通过右键单击模型并创建一个新类创建了一个新模型,然后在您发布时编写了代码,但是它说错误 11 找不到类型或命名空间名称“SelectedFlightId”(您是否缺少 using 指令或程序集引用?) List 也出现类似的错误,说 Expected class、delegate、enum、interface 或 struct。请通过将 int 添加到所选航班 ID 来解决您的答案中的此问题
  • 另外(我不知道如何解决这个问题)我的控制器出现错误,上面写着The name 'f' does not exist in the current context。是什么导致这种情况发生?
  • @BorisSmith 谢谢你,我在发布答案时忘记复制int
  • @BorisSmith 我修复了f 出现的代码,请再次复制代码。
  • 好的,非常感谢,最后一件事:Cannot implicitly convert type 'int' to 'string' 上面写着Value = f.FlightID。是什么导致这种情况发生?
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多