2011-09-17 5 views
0

저는 작업중인 mvc 사이트에 대한 확장 가능한 검색 패턴을 찾기 위해 노력해 왔으며 검색 기능을 확장하기 위해해야 ​​할 일을 최소화하기 위해 기본 기능을 원했습니다. 다른 컨트롤러 옵션을 추가합니다.컨트롤러 및 뷰가있는 ASPNET MVC3 Generics

특정 엔티티와 모델 유형을 추정하는 기본 추상 검색 가능 컨트롤러가 어디에서 나올지 결정하는 데 문제가 있습니다. 매퍼 참조는 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); 
    } 
} 

답변

1

나는 정말로 당신의 문제를 이해하지 못한다고 생각합니다.

모델의 모델은 @model SearchModel<WhateverYourTModelIs>입니다. "무료 배관 공사"란 무엇입니까?

아마도 혼란 스럽긴하지만 파생 컨트롤러에 대한 정적 유형을 정의해야합니다. 정적 유형보기를 정의 할 때의 문제점은 무엇입니까?

+0

검색 결과보기에서 발생하는 대부분은 검색 상자 및 결과 집합을 열거하여 구체적인 구현이 특정 항목 형식을 가질 수 있도록 부분적으로 볼 수 있도록 할 수 있습니다 (예 : 사람 대 책이 다르게 보일 수 있습니다. 개별 항목에서 수행). 구현 된 컨트롤러는 SearchModel 또는 내가 가정 한 것으로 추측 할 수있는 마스터보기를 사용할 수 있습니다. – Lawrence

+0

@Lawrence - 귀하의 요지를 잘 모르겠습니다. 컨트롤러의 구체적인 버전을 만들어야합니다. 즉,'public class MyController : SearchableController '와 같이,'@model SearchModel '을 사용할 때의 문제점은 무엇입니까? –

0

그래, 내가 그 길로 끝났다고 생각해. 그런 다음 검색 입력, 페이지 매김, 현재 페이지 번호 등과 같은 검색 패턴 리 바인드와 같은 검색 모델의 공통 뷰 부분을 처리하는 마스터보기를 사용합니다.