У меня есть модель Booking, и я создаю список всех ее элементов в BookingController. Там мне удалось экспортировать список как. json, однако, когда я хочу импортировать файл, я не могу использовать свою настраиваемую проверку, чтобы увидеть, только ли это. json. Проблема в том, что в моем индексе для бронирования у меня есть модель IEnumerable для бронирования, и я использую модель BookingsUpload для загрузки файла. Итак, как мне получить доступ к этой модели BookingsUpload внутри индекса или как ее изменить? (могу ли я совместить то, что я делаю в BookingsUpload, с моей моделью бронирования?
Модель бронирования:
public class Booking
{
[Required]
[Display(Name = "Ladestand")]
[Range(0, 100)]
public double chargeState { get; set; }
[Required]
[Display(Name = "Benötigte Fahrstrecke")]
[Range(1, 1000)]
public double distance { get; set; }
[Required]
[Display(Name = "Beginn")]
public DateTime startTime { get; set; }
[Required]
[Display(Name = "Ende")]
public DateTime endTime { get; set; }
[Required]
[Display(Name = "Anschlusstyp")]
[EnumDataType(typeof(ConnectorType))]
[JsonConverter(typeof(StringEnumConverter))]
public ConnectorType connectorType { get; set; }
}
public class BookingList
{
public List<Booking> BookingListObj { get; set; }
}
Модель BookingsUpload:
public class BookingsUpload
{
[Required(ErrorMessage = "Please select a file.")]
[DataType(DataType.Upload)]
[MaxFileSize(1024 * 1024)]
[AllowedExtensions(new string[] { ".json" })]
public IFormFile File { get; set; }
}
** НОВОЕ ОБНОВЛЕНИЕ ** : Теперь контроллер не работает должным образом. Невозможно добавить элементы в список (или, может быть, они добавлены, просто не могут отобразить его в представлении, не уверен): Контроллер:
public class BookingController : Controller
{
private IMemoryCache _cache;
private string bookingsKey = "bookingsList";
public BookingController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
public IActionResult Index()
{
List<Booking> bookigsList;
_cache.TryGetValue<List<Booking>>(bookingsKey, out bookigsList);
return View(bookigsList);
}
/* MVVC fucking failed :(
public IActionResult Index()
{
BookingList bookingsList;
//_cache.TryGetValue(bookingsKey, out bookingList);
bookingsList = new BookingList();
bookingsList.BookingListObj = new List<Booking>();
bookingsList.BookingListObj.Add(new Booking() { chargeState = 30, distance = 150, startTime = new DateTime(2020, 8, 13, 13, 45, 0), endTime = new DateTime(2020, 8, 13, 17, 0, 0) });
_cache.Set<List<Booking>>(bookingsKey, bookingsList.BookingListObj);
BookingViewModel bookingViewModel = new BookingViewModel()
{
Bookings = bookingsList.BookingListObj
};
return View(bookingViewModel);
}*/
[HttpGet]
public IActionResult Create()
{
Booking booking = new Booking();
return View("Create", booking);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Booking booking)
{
List<Booking> bookingsList;
//BookingList bookingsList;
/*_cache.TryGetValue(bookingsKey, out bookingsList);
BookingViewModel bookingViewModel = new BookingViewModel()
{
BookingList = bookingsList
};*/
if (!ModelState.IsValid)
{
return View("Create", booking);
}
if (!_cache.TryGetValue(bookingsKey, out bookingsList))
{
bookingsList = new List<Booking>();
}
bookingsList.Add(booking);
_cache.Set<List<Booking>>(bookingsKey, bookingsList);
/*BookingViewModel bookingViewModel = new BookingViewModel()
{
BookingList = bookingsList
};*/
return RedirectToAction("Index", "Booking");
}
BookingViewModel:
public class BookingViewModel
{
public Booking Booking { get; set; }
public BookingList BookingList { get; set; }
public IEnumerable<Booking> Bookings { get; set; }
public BookingsUpload BookingsUpload { get; set; }
public BookingViewModel()
{
Booking = new Booking();
Bookings = new List<Booking>();
BookingsUpload = new BookingsUpload();
}
}
Индекс бронирования:
@model WebApplication.ViewModels.BookingViewModel
@{
ViewData["Title"] = "Index";
}
<br />
<div class="container row p-0 m-0">
<div class="container col 6">
<h1 class="text-info">Übersicht aller Buchungen</h1>
</div>
<div class="container col-3">
<div class="m-1">
<a asp-controller="Booking" asp-action="Create" class="btn btn-info form-control text-white">Erstelle Buchung</a>
</div>
<div class="d-flex flex-row">
<div class="w-100 m-1">
<a asp-controller="Booking" asp-action="Export" class="btn btn-info form-control text-white">Export</a>
</div>
<div class="w-100 m-1">
<form asp-controller="Booking" asp-action="Import" method="post" enctype="multipart/form-data">
<div class="form-group">
<label class="custom-file-upload">
<input type="file" name="file" onchange="this.form.submit()" />
Import/validation_bc_fuck_MVC
</label>
<span asp-validation-for="BookingsUpload.File" class="text-danger"></span>
</div>
</form>
<a asp-controller="Booking" asp-action="Import" class="btn btn-info form-control text-white">Import + validation</a>
</div>
</div>
</div>
<div class="col-12">
@if (Model.Booking != null)
{
<table class="table table-striped table-borderless table-hover">
<thead class="thead-dark">
<tr>
<th>
@Html.DisplayNameFor(model => Model.Booking.chargeState) %
</th>
<th>
@Html.DisplayNameFor(model => Model.Booking.distance) (km)
</th>
<th>
@Html.DisplayNameFor(model => Model.Booking.connectorType)
</th>
<th>
@Html.DisplayNameFor(model => Model.Booking.startTime)
</th>
<th>
@Html.DisplayNameFor(model => Model.Booking.endTime)
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Bookings)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.chargeState)
</td>
<td>
@Html.DisplayFor(modelItem => item.distance)
</td>
<td>
@Html.DisplayFor(modelItem => item.connectorType)
</td>
<td>
@Html.DisplayFor(modelItem => item.startTime)
</td>
<td>
@Html.DisplayFor(modelItem => item.endTime)
</td>
</tr>
}
</tbody>
</table>
}
else
{
<p>Es sind keine Buchungen vorhanden</p>
}
</div>
</div>
<style>
input[type="file"] {
display: none;
}
.custom-file-upload {
color: #fff !important;
background-color: #17a2b8;
border-color: #17a2b8;
/*text display: inline-block;*/
cursor: pointer;
font-weight: 400;
text-align: center;
vertical-align: middle;
user-select: none;
border: 1px solid transparent;
padding: 6px 12px;
font-size: 1rem;
line-height: 1.5;
border-radius: .25rem;
transition: color .15s;
width: 100%;
height: calc(1.5em + .75rem + 2px);
}
.custom-file-upload:hover {
background-color: #138496;
border-color: #117a8b;
}
</style>
Таким образом, ярлык «Импорт» является проблемой, потому что я не могу получить доступ к файлу из BookingsUpload, чтобы сделать диапазон asp -validation-for = "File", но с кнопку «Импорт», мне удалось go в другое представление с помощью только этого кода ниже, и там проверка работает, потому что там я могу использовать модель BookingsUpload:
@model WebApplication.Models.BookingsUpload;
@{
ViewData["Title"] = "Import";
}
<h1>Import</h1>
<form asp-controller="Booking" asp-action="Import" method="post" enctype="multipart/form-data">
<div class="form-group">
<label class="custom-file-upload">
<input asp-for="File" type="file" name="file" onchange="this.form.submit()" />
Import
</label>
<span asp-validation-for="File" class="text-danger"></span>
</div>
</form>