@model ProdutoViewModel
@{
Layout = "_Layout";
}
- Go somewhere
}
Вот мой контроллер:
using Microsoft.AspNetCore.Mvc;
using kssgrafica.Data;
using kssgrafica.Models;
using kssgrafica.Models.ViewModels;
using ImageMagick;
using kssgrafica.Services;
using kssgrafica.Services.ImageHandler;
using kssgrafica.Services.ImageHandler.Dtos;
using Microsoft.EntityFrameworkCore;
using AutoMapper;
using kssgrafica.Models.AuxiliaryModels;
using kssgrafica.Extensions;
namespace kssgrafica.Controllers
{
public class ProdutoController(ApplicationDbContext context, IImageHandler _imageHandler, IMapper mapper) : Controller
{
private readonly ApplicationDbContext _context = context;
private readonly IMapper _mapper = mapper;
private string DefaultPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images");
public IActionResult Index()
{
var produtos = _context.Produtos.Include(p => p.Categoria).Include(p => p.Imagens).ToList();
var produtosViewModel = _mapper.Map(produtos);
return View(produtosViewModel);
}
public async Task LoadTable(DtParameters dtParameters)
{
var searchBy = dtParameters.Search?.Value;
// if we have an empty search then just order the results by Id ascending
var orderCriteria = "Id";
var orderAscendingDirection = true;
if (dtParameters.Order != null)
{
// in this example we just default sort on the 1st column
orderCriteria = dtParameters.Columns[dtParameters.Order[0].Column].Data;
orderAscendingDirection = dtParameters.Order[0].Dir.ToString().ToLower() == "asc";
}
var produtos = await _context.Produtos.ToListAsync();
var produtosViewModel = _mapper.Map(produtos);
var result = produtosViewModel.AsQueryable();
if (!string.IsNullOrEmpty(searchBy))
{
result = result.Where(r => r.Nome != null && r.Nome.ToUpper().Contains(searchBy.ToUpper()) ||
r.Descricao != null && r.Descricao.ToUpper().Contains(searchBy.ToUpper()) ||
r.Preco != null && r.Preco.ToString().ToUpper().Contains(searchBy.ToUpper()) ||
r.Id != null && r.Id.ToString() == searchBy.ToUpper());
}
result = orderAscendingDirection ? result.OrderByDynamic(orderCriteria, DtOrderDir.Asc) : result.OrderByDynamic(orderCriteria, DtOrderDir.Desc);
// now just get the count of items (without the skip and take) - eg how many could be returned with filtering
var filteredResultsCount = result.Count();
var totalResultsCount = await _context.Produtos.CountAsync();
return Json(new DtResult
{
Draw = dtParameters.Draw,
RecordsTotal = totalResultsCount,
RecordsFiltered = filteredResultsCount,
Data = result
.Skip(dtParameters.Start)
.Take(dtParameters.Length)
.ToList()
});
}
public IActionResult Create()
{
ViewBag.Categorias = _context.CategoriasProduto.ToList();
return View();
}
[HttpPost]
public async Task Create(ProdutoViewModel produtoViewModel, List imagens, IFormFile imagemPerfil)
{
produtoViewModel.DataCadastro = DateTime.UtcNow;
var produto = _mapper.Map(produtoViewModel);
_context.Add(produto);
await _context.SaveChangesAsync();
await SalvarImagens(imagens, imagemPerfil, produto);
return RedirectToAction(nameof(Index));
}
[HttpGet]
public async Task Edit(int id)
{
ViewBag.Categorias = await _context.CategoriasProduto.ToListAsync();
var produto = await _context.Produtos.Where(p => p.Id == id).Include(p => p.Imagens).FirstOrDefaultAsync();
var produtoViewModel = _mapper.Map(produto);
return View(produtoViewModel);
}
[HttpPost]
public async Task Edit(ProdutoViewModel produtoViewModel, int[] imgsDeletadas, List imagens, IFormFile imagemPerfil)
{
var produto = _mapper.Map(produtoViewModel);
_context.Update(produto);
await DeleteImages(imgsDeletadas);
await SalvarImagens(imagens, imagemPerfil, produto);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
[HttpPost]
public async Task LoadCards(CardParameters cardParameters)
{
var produtos = await _context.Produtos.Include(p => p.Imagens).ToListAsync();
var result = _mapper.Map(produtos);
if (!string.IsNullOrEmpty(cardParameters.SearchValue))
{
result = result.Where(p => p.Id.ToString().ToUpper() == cardParameters.SearchValue.ToUpper() ||
p.Nome != null && p.Nome.ToUpper().Contains(cardParameters.SearchValue.ToUpper()) ||
p.Descricao != null && p.Descricao.ToUpper().Contains(cardParameters.SearchValue.ToUpper())).ToList();
}
var response = new CardResponse()
{
Result = result.Take(cardParameters.ResultsQtd).ToList(),
LengthTotalRegisters = await _context.Produtos.CountAsync(),
LengthFiltredResults = result.Count()
};
return PartialView("Cards",response);
}
private async Task SalvarImagens(List imagensGaleriaArquivo, IFormFile imagemPerfilArquivo, Produto produto)
{
foreach(var arquivo in imagensGaleriaArquivo)
{
var imagemGaleria = new Imagem()
{
Nome = "",
NomeArquivo = Guid.NewGuid().ToString(),
File = arquivo,
Extensao = _imageHandler.GetExtension(arquivo),
IdProduto = produto.Id,
Path = DefaultPath,
Perfil = false
};
var dtoGaleria = imagemGaleria.ToImageDto();
if(await _imageHandler.SaveImageAsync(dtoGaleria))
{
try
{
_context.Add(imagemGaleria);
} catch(Exception ex)
{
Console.WriteLine(ex.Message);
_imageHandler.DeleteImage(dtoGaleria);
}
}
}
if(imagemPerfilArquivo != null)
{
var imagemPerfil = new Imagem()
{
Nome = "",
NomeArquivo = Guid.NewGuid().ToString(),
File = imagemPerfilArquivo,
Extensao = _imageHandler.GetExtension(imagemPerfilArquivo),
IdProduto = produto.Id,
Path = DefaultPath,
Perfil = true
};
var dtoPerfil = imagemPerfil.ToImageDto();
try
{
if(await _imageHandler.SaveImageAsync(dtoPerfil))
{
_context.Add(imagemPerfil);
}
} catch(Exception ex)
{
Console.WriteLine(ex.Message);
_imageHandler.DeleteImage(dtoPerfil);
}
}
await _context.SaveChangesAsync();
}
private async Task DeleteImages(int[] imagesIds)
{
if(imagesIds.Length > 0)
{
var imagesIdsList = imagesIds.ToList();
var images = await _context.Imagens.Where(img => imagesIdsList.Contains(img.Id)).ToListAsync();
foreach(var img in images)
{
img.Path = DefaultPath;
_imageHandler.DeleteImage(img.ToImageDto());
_context.Remove(img);
}
await _context.SaveChangesAsync();
}
}
}
}
В проблеме задействованы методы Edit, post and get и LoadCards.
Я не знаю, почему Edit (метод get) является вызывается, когда я загружаю PartialView, но я помещаю if, который обрабатывает случай, когда идентификатор равен 0, возвращая Ok(), но я хочу знать, почему это происходит.
Здесь моя попытка:
public async Task Edit(int id)
{
if(id == 0)
{
return Ok();
}
ViewBag.Categorias = await _context.CategoriasProduto.ToListAsync();
var produto = await _context.Produtos.Where(p => p.Id == id).Include(p => p.Imagens).FirstOrDefaultAsync();
var produtoViewModel = _mapper.Map(produto);
return View(produtoViewModel);
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... dnt-call-i