Я новенький с MVC. Я пытаюсь разработать приложение для бронирования автомобиля. У меня есть таблица с названием Reservations и одна с именем Cars . Я должен отображать доступные автомобили для пользователей с указанным местоположением, временным интервалом (автомобили, которые в данный момент не зарезервированы).
Моя идея состоит в том, чтобы создать представление для получения данных от пользователя (местоположение, временной интервал), и после того, как он отправит эти данные, он будет перенаправлен на страницу, которая отображает эти записи (сведения об автомобиле). Проблема в том, что я действительно не знаю, как привязать представления и как отображать их из списка.
Вот что я пробовал:
Мой контроллер:
public ActionResult DisplayCars()
{
return View();
}
Здесь я попытался составить список и добавить полученные записи из базы данных
[HttpPost]
public ActionResult AvailableCars([Bind(Include = "StartDate,EndDate,Location")] Reservations reservation)
{
List<Cars> carList = null;
if (ModelState.IsValid)
{
if (reservation.StartDate != null && reservation.EndDate != null && reservation.Location != null)
{
carList = db.Database.SqlQuery<Cars>("Select * from Cars WHERE Location = @location AND CarID NOT IN" +
"(Select CarID FROM Reservations WHERE NOT (StartDate > @endDate) OR (EndDate < @startDate))",
new SqlParameter("location", reservation.Location), new SqlParameter("endDate", reservation.EndDate), new SqlParameter("startDate", reservation.StartDate)).ToList<Cars>();
}
else if(reservation.StartDate == null && reservation.EndDate == null && reservation.Location != null)
{
carList = db.Database.SqlQuery<Cars>("Select * from Cars WHERE Location = @location",
new SqlParameter("location", reservation.Location)).ToList<Cars>();
}
else if(reservation.StartDate != null && reservation.EndDate != null && reservation.Location == null)
{
carList = db.Database.SqlQuery<Cars>("Select * from Cars WHERE CarID NOT IN" +
"(Select CarID FROM Reservations WHERE NOT (StartDate > @endDate) OR (EndDate < @startDate))",
new SqlParameter("endDate", reservation.EndDate), new SqlParameter("startDate", reservation.StartDate)).ToList<Cars>();
}
}
if(carList == null)
{
ModelState.AddModelError("", "No available cars");
}
return View(carList);
}
Вот мой вид для получения ввода от пользователя:
@model RentC.UI.Models.Reservations
@{
ViewBag.Title = "DetailsAvailableCars";
}
<h2>DetailsAvailableCars</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.StartDate, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.StartDate, new { htmlAttributes = new { @class = "form-control date-picker" } })
@Html.ValidationMessageFor(model => model.StartDate, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.EndDate, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.EndDate, new { htmlAttributes = new { @class = "form-control date-picker" } })
@Html.ValidationMessageFor(model => model.EndDate, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Location, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Location, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Location, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Search" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "AvailableCars")
</div>
Это Вид для отображения записей
@model IEnumerable<RentC.UI.Models.Cars>
@{
ViewBag.Title = "Available Cars List";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Plate)
</th>
<th>
@Html.DisplayNameFor(model => model.Manufacturer)
</th>
<th>
@Html.DisplayNameFor(model => model.Model)
</th>
<th>
@Html.DisplayNameFor(model => model.PricePerDay)
</th>
<th>
@Html.DisplayNameFor(model => model.Location)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Plate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Manufacturer)
</td>
<td>
@Html.DisplayFor(modelItem => item.Model)
</td>
<td>
@Html.DisplayFor(modelItem => item.PricePerDay)
</td>
<td>
@Html.DisplayFor(modelItem => item.Location)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.CarID }) |
@Html.ActionLink("Details", "Details", new { id=item.CarID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.CarID })
</td>
</tr>
}
</table>
Это моя модель автомобиля
public partial class Cars
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Cars()
{
this.Reservations = new HashSet<Reservations>();
}
public int CarID { get; set; }
[Display(Name = "Cart Plate")]
public string Plate { get; set; }
public string Manufacturer { get; set; }
public string Model { get; set; }
public decimal PricePerDay { get; set; }
public string Location { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Reservations> Reservations { get; set; }
}
}
Это модель для бронирования
public partial class Reservations
{
public int ReservationID { get; set; }
public int CarID { get; set; }
public int CustomerID { get; set; }
public System.DateTime StartDate { get; set; }
public System.DateTime EndDate { get; set; }
public virtual Cars Cars { get; set; }
}
Пожалуйста, помогите мне советами или идеи. Спасибо!