Я пытаюсь создать метод, который создает и вставляет 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>