Я создал универсальный c CRUD-контроллер, который используется для каждого контроллера, но моя проблема в том, что я не могу использовать метод Create каждый раз, потому что иногда мне нужно передать ViewModel для действия Create, как я могу преодолеть эту проблему? Одной из моих мыслей было создание дочернего контроллера и наследование BaseCrudController, чтобы я мог переопределить Create и другие методы, в которых я собираюсь использовать ViewModels. Другая мысль состояла в том, чтобы использовать делегат для определения времени выполнения, какую модель и какую модель представления я должен использовать. Каковы наилучшие возможные решения для этого?
public abstract class BaseCrudController<T> : Controller
where T : class, IEntity, new()
{
protected IGenericService<T> genericService;
public BaseCrudController(IGenericService<T> _genericService)
{
genericService = _genericService;
}
[HttpGet]
public virtual async Task<ActionResult> Index() => View(await genericService.GetAllAsync());
[HttpGet]
public virtual ActionResult Create() => View(new T());
[HttpPost]
public virtual async Task<ActionResult> Create(T entity)
{
if (!ModelState.IsValid)
{
return View();
}
if(entity.Id == 0)
{
var created_ent = await genericService.InsertAsync(entity);
TempData["message"] = $"{created_ent} buvo sukurtas!";
}
else
{
var updated_ent = await genericService.UpdateAsync(entity);
TempData["message"] = $"{updated_ent} buvo redaguotas!";
}
return RedirectToAction(nameof(Index));
}
[HttpGet]
public async Task<IActionResult> Edit(int id) =>
View(nameof(Create), await genericService.GetByIdAsync(id));
[HttpPost]
public async Task<IActionResult> Delete(int id)
{
var entity = await genericService.DeleteAsync(id);
if(entity != null)
{
TempData["message"] = $"{entity} buvo ištrintas!";
}
return RedirectToAction(nameof(Index));
}
}
для generi c TI реализуют интерфейс IEntity
public interface IEntity
{
int Id { get; set; }
DateTime CreatedOn { get; set; }
DateTime UpdatedOn { get; set; }
string CreatedBy { get; set; }
string UpdatedBy { get; set; }
}
Прямо сейчас я унаследовал от базового контроллера CRUD и перегруженного действия в дочернем контроллер. Проблема в том, что только одна строка кода и аргумента отличается от родительского действия.
Этот:
viewModel.Post.Images = viewModel.Images;
[HttpPost]
public async Task<ActionResult> Create(PostViewModel viewModel)
{
if (!ModelState.IsValid)
{
return View();
}
viewModel.Post.Images = viewModel.Images;
if (viewModel.Post.Id == 0)
{
var created_ent = await genericService.InsertAsync(viewModel.Post);
TempData["message"] = $"{created_ent} buvo sukurtas!";
}
else
{
var updated_ent = await genericService.UpdateAsync(viewModel.Post);
TempData["message"] = $"{updated_ent} buvo redaguotas!";
}
return RedirectToAction(nameof(Index));
}