我在ASP.NET MVC4中有一个虚构的网站,旨在模拟私人飞机租赁公司的机票预订系统。但是,在实现我想要的功能时,我正在努力,其中一个是使用下拉菜单将数据存储到另一个数据库
让您更好地了解我的目标
然后
另外
这让我感到非常困惑。
我有两个与航班相关的页面:
第1页(Flights.cshtml
- 显示可用航班的表格):http://gyazo.com/2ab67e35bdd1967e4a24706e398ba759
第2页(BookFlight
会显示一个下拉菜单,允许用户选择他们想要的航班):http://gyazo.com/67948e5e8be82c72f7ee0914dfa9b5f6
(解决方案资源管理器中项目文件的屏幕截图)
以下是与航班表相关的相关文件(第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”的数据库表中的字段? (我还没有制作这张桌子)。如果这有道理?
如何获取用户选择的信息(来自下拉列表)并按下按钮进行存储?这甚至可能吗?有人能够根据我上面列出的代码向我展示一个有效的例子吗?
答案 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);
}