Я пытался придумать расширяемый шаблон поиска для сайта MVC, над которым я работаю, и я хотел, чтобы некоторые базовые функции минимизировали то, что мне нужно сделать, чтобы расширить поиск, добавив еще одну опцию контроллера.
У меня возникла проблема с определением, куда бы я пошел, имея базовый абстрактный контроллер с возможностью поиска, который предполагает конкретную сущность и тип модели.Ссылка Mapper относится к AutoMapper и просто отображает объект в модель.Кажется, все работает нормально, но я не уверен, как будет выглядеть представление с точки зрения определения модели, потому что тип является переменной для базовой модели SearchModel.Я мог бы реализовать свое собственное представление в каждом контроллере с помощью @model SearchModel, но мне просто интересно, сколько «бесплатной» сантехники мне может сойти с рук.
public abstract class SearchableController<TModel, TEntity, TRepository> : Controller where TRepository : ISearchableRepository<TEntity> where TEntity : class where TModel : class
{
protected TRepository _repository;
[HttpGet]
public ActionResult Search(string q, int? page)
{
int pageNumber = page.HasValue ? page.Value : 1;
PagedList<TEntity> entities = _repository.Search(q, 10, page);
Mapper.CreateMap<TEntity, TModel>();
var results = new List<TModel>();
foreach (TEntity entity in entities)
{
var entityModel = Mapper.Map<TEntity, TModel>(entity);
results.Add(entityModel);
}
var model = new SearchModel<TModel>();
model.searchPattern = q;
model.pageNumber = pageNumber;
model.Results = new StaticPagedList<TModel>(results, entities.PageNumber, entities.PageSize, entities.TotalItemCount);
return View(model);
}
}