Blazor 5x - قسمت 18 - کار با فرمها - بخش 6 - حذف اطلاعات
نویسنده: وحید نصیری
تاریخ: ۱۳۹۹/۱۲/۲۴ ۱۵:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
@if (HotelRoomModel.HotelRoomImages.Count > 0)
{
var serial = 1;
foreach (var roomImage in HotelRoomModel.HotelRoomImages)
{
<div class="col-md-2 mt-3">
<div class="room-image" style="background: url('@roomImage.RoomImageUrl') 50% 50%; ">
<span class="room-image-title">@serial</span>
</div>
<button type="button"
@onclick="()=>DeletePhoto(roomImage)"
class="btn btn-outline-danger btn-block mt-4">Delete</button>
</div>
serial++;
}
} @code
{
private const string UploadFolder = "Uploads";
private void DeletePhoto(HotelRoomImageDTO imageDto)
{
var imageFileName = imageDto.RoomImageUrl.Replace($"{UploadFolder}/", "", StringComparison.OrdinalIgnoreCase);
if (HotelRoomModel.Id == 0 && Title == "Create")
{
FileUploadService.DeleteFile(imageFileName, WebHostEnvironment.WebRootPath, UploadFolder);
HotelRoomModel.HotelRoomImages.Remove(imageDto);
}
}
} @code
{
private List<string> DeletedImageFileNames = new List<string>();
private void DeletePhoto(HotelRoomImageDTO imageDto)
{
var imageFileName = imageDto.RoomImageUrl.Replace($"{UploadFolder}/", "", StringComparison.OrdinalIgnoreCase);
if (HotelRoomModel.Id == 0 && Title == "Create")
{
// ...
}
else
{
// Edit Mode
DeletedImageFileNames.Add(imageFileName);
HotelRoomModel.HotelRoomImages.Remove(imageDto); // Update UI
}
} private async Task HandleHotelRoomUpsert()
{
// ...
if (HotelRoomModel.Id != 0 && Title == "Update")
{
// Update Mode
var updatedRoomDto = await HotelRoomService.UpdateHotelRoomAsync(HotelRoomModel.Id, HotelRoomModel);
foreach(var imageFileName in DeletedImageFileNames)
{
FileUploadService.DeleteFile(imageFileName, WebHostEnvironment.WebRootPath, UploadFolder);
}
// await AddHotelRoomImageAsync(updatedRoomDto);
await JsRuntime.ToastrSuccess($"The `{HotelRoomModel.Name}` updated successfully.");
}
else
{
// ...
}
}
} .spinner {
border: 16px solid silver !important;
border-top: 16px solid #337ab7 !important;
border-radius: 50% !important;
width: 80px !important;
height: 80px !important;
animation: spin 700ms linear infinite !important;
top: 50% !important;
left: 50% !important;
transform: translate(-50%, -50%);
position: absolute !important;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
} @code
{
private bool IsImageUploadProcessStarted;
private async Task HandleImageUpload(InputFileChangeEventArgs args)
{
try
{
IsImageUploadProcessStarted = true;
// ...
}
finally
{
IsImageUploadProcessStarted = false;
}
}
} <InputFile OnChange="HandleImageUpload" multiple></InputFile>
<div class="row">
@if (IsImageUploadProcessStarted)
{
<div class="col-md-12">
<span><i class="spinner"></i> Please wait.. Images are uploading...</span>
</div>
}
@using BlazorServer.App.Pages.Components
<Confirmation @ref="Confirmation1"
OnCancel="OnCancelDeleteImageClicked"
OnConfirm="@(()=>OnConfirmDeleteImageClicked(ImageToBeDeleted))">
<div>
Do you want to delete @ImageToBeDeleted?.RoomImageUrl image?
</div>
</Confirmation> private Confirmation Confirmation1;
private HotelRoomImageDTO ImageToBeDeleted;
private void OnCancelDeleteImageClicked()
{
// Confirmation1.Hide();
}
private void DeletePhoto(HotelRoomImageDTO imageDto)
{
ImageToBeDeleted = imageDto;
Confirmation1.Show();
}
private void OnConfirmDeleteImageClicked(HotelRoomImageDTO imageDto)
{ <td>
<NavLink href="@($"hotel-room/edit/{room.Id}")" class="btn btn-primary">Edit</NavLink>
<button class="btn btn-danger" @onclick="()=>HandleDeleteRoom(room)">Delete</button>
</td> <Confirmation @ref="Confirmation1"
OnCancel="OnCancelDeleteRoomClicked"
OnConfirm="OnConfirmDeleteRoomClicked">
<div>
Do you want to delete @RoomToBeDeleted?.Name?
</div>
</Confirmation> @code
{
private List<HotelRoomDTO> HotelRooms = new List<HotelRoomDTO>();
private HotelRoomDTO RoomToBeDeleted;
private Confirmation Confirmation1;
private void OnCancelDeleteRoomClicked()
{
// Confirmation1.Hide();
}
private void HandleDeleteRoom(HotelRoomDTO roomDto)
{
RoomToBeDeleted = roomDto;
Confirmation1.Show();
}
private async Task OnConfirmDeleteRoomClicked()
{
if(RoomToBeDeleted is null)
{
return;
}
await HotelRoomService.DeleteHotelRoomAsync(RoomToBeDeleted.Id);
HotelRooms.Remove(RoomToBeDeleted); // Update UI
} An exception occurred while iterating over the results of a query for context type 'BlazorServer.DataAccess.ApplicationDbContext'. System.InvalidOperationException: A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.
// Note: Without this `Include`, HotelRoomImages will be in the detached state and won't be update here.
var actualDbRoom = await _dbContext.HotelRooms.Include(x => x.HotelRoomImages)
.FirstOrDefaultAsync(x => x.Id == roomId);