Как использовать 2 модели в 1 просмотре - PullRequest
1 голос
/ 29 мая 2020

У меня есть модель 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>

Ответы [ 3 ]

4 голосов
/ 29 мая 2020

Вы можете создать модель представления, которая будет содержать Booking и BookingsUpload, и использовать ее в своем представлении.

public class BookingViewModel {
    public Booking Booking {get; set;}
    public BookingsUpload BookingsUpload {get; set;}
}

затем установите эти данные в действии вашего контроллера и установите модель представления на BookingViewModel

@model BookingViewModel
// access Booking object view Model.Booking
// access BookingsUpload object via Model.BookingUploads
0 голосов
/ 30 мая 2020

Итак, я наконец понял, что у меня ОГРОМНАЯ логическая проблема. Мне не нужно использовать две модели в одном представлении. Что я сделал, так это использовал частичное копирование кнопки «Импорт». Примерно так в индексе:

<form asp-controller="Booking" asp-action="Import" method="post" enctype="multipart/form-data">
                <div class="form-group">
                    @{
                        await Html.RenderPartialAsync("_Import", new WebApplication.Models.BookingsUpload());
                    }
                </div>
            </form>

А это фрагмент кнопки Импорт:

    @model WebApplication.Models.BookingsUpload;

<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>

<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>
0 голосов
/ 29 мая 2020

Добавьте конструктор в свой класс, в котором вы инициализируете свои объекты, чтобы он не был нулевым

public class BookingViewModel
{
    public BookingViewModel()
    {
        Booking = new Booking();
        Bookings = new IEnumerable<Booking>();
        BookingsUpload = new BookingsUpload();
    }
    public Booking Booking { get; set; }
    public IEnumerable<Booking> Bookings { get; set; }
    public BookingsUpload BookingsUpload { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...