По сути, у меня есть небольшое приложение .NET MVC, которое служит сайтом для бронирования гостиничных номеров.
Теперь, при создании нового отеля, в моем представлении Razor у меня сначала есть несколько полей, очевидно, необходимых для создания нового отеля, а затем динамически генерируемый список маленьких и больших кроватей для заполнения новых номеров отеля (см. блок кода в конце записи), чтобы пользователь мог нажать кнопку «плюс», чтобы получить новую строку с двумя полями ввода с количеством маленьких и больших кроватей, необходимых для создания новой комнаты.
Теперь, в моем контроллере это приводит к следующему длинному и уродливому методу, о котором я думал:
[HttpPost]
[ActionName("AddHotel")]
public ActionResult AddHotelPost()
{
int[] amountOfBigBedsList = (Request.Form.GetValues("AmountOfBigBeds") ??
throw new InvalidOperationException("The amount of beds for a room cannot be empty"))
.Select(int.Parse).ToArray();
int[] amountOfSmallBedsList = (Request.Form.GetValues("AmountOfSmallBeds") ??
throw new InvalidOperationException("The amount of beds for a room cannot be empty"))
.Select(int.Parse).ToArray();
if (amountOfSmallBedsList.Length != amountOfBigBedsList.Length) return View("AddHotel");
// The amounts must match since they are both required
Hotel newHotel = new Hotel
{
Name = Request.Form.Get("HotelName"),
Location = new Location { City = Request.Form.Get("City"), Country = Request.Form.Get("Country") },
Address = Request.Form.Get("Address"),
Rooms = new List<HotelRoom>(),
};
for (int i = 0; i < amountOfSmallBedsList.Length; i++)
{
_uow.HotelRepository.AddRoom(newHotel, new HotelRoom
{
AmountOfSmallBeds = amountOfSmallBedsList[i],
AmountOfBigBeds = amountOfBigBedsList[i],
HotelRefId = newHotel.Id,
Hotel = newHotel,
});
}
_uow.HotelRepository.Add(newHotel);
_uow.Save(); // Unit of Work
return RedirectToAction("../Hotel/AllHotels", new { hotel_id = newHotel.Id });
}
Я хотел бы воспользоваться преимуществами привязки Entity Framework, чтобы просто взять в сигнатуре метода что-то вроде AddHotelPost(Hotel newHotel, List<HotelRoom> newHotelRooms)
и чтобы инфраструктура выполняла всю работу без всего этого длинного уродливого кода, который я написал, чтобы вручную получить форму данные и назначить их новым объектам Hotel и List.
Кстати, имена, используемые для атрибутов в моих моделях, совпадают с полями 'name', которые я использовал в моих тегах ввода html.
Я только начал работать с .NET несколько недель назад, так что будьте осторожны, ха-ха. Любые рекомендации приветствуются.
Код вида бритвы:
<form method="post" action="/Hotel/AddHotel" class="form-inline my-2 my-lg-0 hotelForm">
<div class="form-group">
<input name="HotelName" class="form-control mr-sm-2" type="text" placeholder="AccommodationName" aria-label="AccommodationName" required>
<input name="City" class="form-control mr-sm-2" type="text" placeholder="City" aria-label="City" required>
<input name="Country" class="form-control mr-sm-2" type="text" placeholder="Country" aria-label="Country" required>
<input name="Address" class="form-control mr-sm-2" type="text" placeholder="Address" aria-label="Address" required>
</div>
<br />
<hr />
<div class="form-group" id="addRoomAndSubmitSection">
<button type="button" class="btn btn-default btn-sm" id="addRoomField"> <span class="glyphicon glyphicon-plus"></span></button>
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Add Accommodation</button>
</div>
<script>document.getElementById('addRoomField').click();</script>
</form>
@section scripts
{
<script>
$(document).ready(function () {
$("#addRoomField").click(function (event) {
event.preventDefault();
$(`<div class="form-group roomForm">
<input name="AmountOfBigBeds" class="form-control mr-sm-2" type="number" min="0" max="4" placeholder="Amount of big beds"
aria-label="Amount of big beds" style="width: 13em;" required>
<input name="AmountOfSmallBeds" class="form-control mr-sm-2" type="number" min="0" max="4" placeholder="Amount of small beds"
aria-label="Amount of small beds" style="width: 13em;" required>
</div>
<br />
<hr />`).insertBefore($(`#addRoomAndSubmitSection`));
});
});
</script>
}