Я создал версию того, что вы предлагаете (хотя, по общему признанию, относительно не ООП), и она очень хорошо сработала для меня.
Я создал MasterController, который устанавливает экземпляр БД и несколько других переменных. Как только я начал изучать сходство в моих действиях CRUD, я понял, что это можно абстрагировать и перенести в метод внутри мастера. На самом деле два метода.
protected ActionResult DisplayValidateAndEditModel<TModel>(TModel model, string modelPrefix,
string editViewName, string successActionName, object routeValues, string successMessage,
string[] includeProperties, bool acceptFiles
) where TModel : class
и
protected ActionResult DisplayValidateAndEditModel<TModel>(TModel model, string modelPrefix,
string editViewName, string successActionName, string successMessage,
string[] includeProperties
) where TModel : class
Редактировать охватывает создание / чтение / обновление, а удаление - удаление. Листинг - это одна строка в контроллере - я просто получаю группу моделей и добавляю в viewdata.
Оба метода проверяют, является ли это сообщение. Если нет, они возвращают вид. Если так:
редактировать вызывает TryUpdateModel, а также выполняет некоторую проверку xVal. Если все в порядке, он перенаправляет на successAction с любым routeValues. Если нет, он снова показывает вид. includeProperties можно передать так, чтобы мой контроллер мог точно указать, что может получать обновления. А acceptFiles добавляет дополнительные функциональные возможности, где ищет запись файла и, если она есть, помещает ее в базу данных и создает ссылку между записью файла и моделью.
delete обновляет свойства модели Cancel_Date и Cancel_User (у меня есть интерфейс ICancelable) и перенаправляет на успешное действие