Контроллер Generi c CRUD - PullRequest
0 голосов
/ 29 апреля 2020

Я создал универсальный 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));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...