Как правильно передать новый Guid через View Model в модель EF - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь создать метод, который создает и вставляет Guid в базу данных ранее сохраненного медиа-файла в wwwroot моего проекта. Я разделил сущность в основном на три части: модель EF на уровне данных, модель сервиса на бизнес-уровне и ViewModel на веб-уровне.

Файл сохраняется в папке на веб-слое, как я уже сказал, и я уже успешно создал метод с намерением выгрузить и извлечь заархивированную папку, и он передает извлеченные файлы в очищенную папкуструктура в папке wwwroot. Я попытался построить ViewModel и вручную сопоставить их с моделью EF. Виртуальная машина содержит 3 модели, называемые EF: MediaModel, FolderUpload и Test.

В методе, который загружает / извлекает папку, он немедленно присоединяет новый Guid к самой папке в базе данных и перечисляет, где папка сохранена. Вот и все для этого метода.

В текущем методе, с которым у меня возникают проблемы, я пытаюсь сделать то же самое с медиа-файлами, установить для него булеву опцию 'select', сразу же присоединить новый guidи сохранить папку / файл в базу данных. Я получаю нулевую ссылку на него, когда ставлю точку останова. И, конечно, я добавлю примеры кодов, чтобы продемонстрировать, что происходит.

Это от контроллера:

public IActionResult CreateMediaTest([Bind("LocationPath, Selected, MediaID, TestID, FolderName, DataAdded")]CombinedMediaViewModel fm, string path, string Id)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var getTestItem = _service.GetMediaTestByID(Id);
                    var getMediaItem = _service.GetMediaItem(Id);
                    var getFolderByID = _service.GetFolderByID(Id);
                    var getLocationPath = _service.GetLocationPath(path);

                    MediaModel test = new MediaModel
                    {
                        MediaID = getMediaItem.MediaID,
                        TestID = getTestItem.TestID,
                        Selected = true,
                        LocationPath = getLocationPath.ExtractPath,
                        FolderName = fm.Folder.FolderName,
                        DateAdded = fm.Media.DateAdded
                    };

                    var result = _service.CreateMediaTest(test);

                }
                TempData[StaticString.StatusMessage] = "Your have successfully created a test!";
                return RedirectToAction(nameof(UploadConfirmationPage), new { id = fm.MediaID == Guid.Empty });
            }
            catch (Exception ex)
            {

                TempData[StaticString.StatusMessage] = "Error: " + ex.Message;
                return RedirectToAction(nameof(ManageCurrentMediaPage), new { id = fm.MediaID == Guid.Empty });
            }


        }

Это от бизнес-уровня:

        public MediaModel GetMediaItem(string ID)
        {
            return _repo.GetMediaItem(ID);
        }

        public FolderUpload GetFolderByID(string ID)
        {
            return _repo.GetFolderByID(ID);
        }

        public FolderUpload GetLocationPath(string path)
        {
            return _repo.GetLocationPath(path);
        }

Это ViewModel:

    public class CombinedMediaViewModel
    {
        #region Mapped Entity Items
        public MediaModel Media { get; set; }
        public FolderUpload Folder { get; set; }
        public Test Test { get; set; }
        public IdentityUser User { get; set; }
        #endregion

        #region Mapped Frontend Items
        public string FolderPath { get; set; }
        public string FolderName { get; set; }
        public Guid MediaID { get; set; }
        public string UserID { get; set; }
        public DateTime DateCreated { get; set; }
        public Guid TestID { get; set; }
        public bool Selected { get; set; }
        #endregion
    }

Это представление cshtml:

     <div class="d-flex justify-content-between align-items-center mb-3">
                            @if (Model.URL.ToLower() != "/explorer/")
                            {
                                <h4 class="card-title mb-0">@Model.FolderName</h4>
                                <div class="titles">
                                    @await Html.PartialAsync(PartialView.StatusMessage, TempData[StaticString.StatusMessage])
                                </div>
                            }
                        </div>
                        <div class="card-block">

                            <ul>
                                @*Listing the directories *@
                                @foreach (Crowdsource.DataAccess.Models.FolderUpload dir in Model.FolderList)
                                {
                                    <li>
                                        <input type="hidden" asp-for="@dir.FolderID" />
                                        <input type="hidden" asp-for="@dir.FolderName" />
                                        <input type="hidden" asp-for="@dir.ExtractPath" />
                                        <img src="~/img/folder.jpg" alt="Folder" align="top" style="width: 20px; height: 20px; border: none" />
                                        <a href="@(Model.URL + dir.FolderName)/" title="@dir.FolderName">@dir.FolderName</a>
                                        . . . . . . @dir.DateAdded
                                    </li>
                                }
                                @*Listing the files *@
                                @*@foreach (Crowdsource.DataAccess.Models.MediaModel item in Model.MediaItem)
                                    {
                                        <li>
                                            <input type="hidden" asp-for="@item.Test.TestName" />
                                        </li>
                                *@
                                @foreach (Crowdsource.DataAccess.Models.MediaModel file in Model.MediaList)
                                {

                                    <li>

                                        <input type="hidden" asp-for="@file.MediaID" />
                                        <input type="hidden" asp-for="@file.FileName" />
                                        <input type="hidden" asp-for="@file.DateAdded" />
                                        <input type="hidden" asp-for="@file.Folder.FolderName" />
                                        <input type="hidden" asp-for="@file.Test.AID" />
                                        <input type="checkbox" asp-for="@file.Selected" class="form-check-input" />
                                        <img src="~/img/image.png" alt="Folder" align="top" style="width: 20px; height: 20px; border: none" />
                                        <a href="@(Model.URL + file.FileName)"
                                           title="@file.FileName" target="_blank">
                                            @file.FileName
                                        </a>. . . . . . @file.FileSizeText
                                        . . . . . . @file.DateAdded

                                    </li>

                                }
                            </ul>
                            <div class="card-footer">
                                <button type="submit" class="btn btn-inverse-success">Create Test</button>
                                <button type="submit" class="btn btn-inverse-danger">Delete Folder</button>
                            </div>

                        </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...