2010-03-09 4 views
2

많은 (가능한 경우 null) 기준으로 정렬하도록 컨트롤러를 설정하는 가장 좋은 방법은 무엇입니까? 예를 들어 자동차 판매 사이트를 만들고있었습니다. 내 CarController는 뷰에 IList를 반환하는 Index() 함수를 가지고 있으며 각 자동차의 세부 정보가 부분 뷰와 함께 렌더링됩니다.여러 기준을 정렬하기 위해 컨트롤러를 구성하는 방법 asp.net mvc

구조를 구성하는 가장 좋은 방법은 무엇입니까? 특히 자동차 종류 (일명 SUV), 자동차 브랜드, 자동차 모델, 자동차 연도, 자동차 가격, 자동차 색상, 불량 IsNew, 또는 내가 가장 가까운 곳에서 정렬하려는 경우 등 많은 기준이있는 경우 ... 특히, ORM으로 NHibernate를 사용하고 있습니다. 가능한 한 NHibernate 쿼리 톤을 가져야 만 컨트롤러에서 if/then을 기반으로 선택할 수있는 항목을 찾아야합니까? 아니면 더 간단한 방법이 있습니다.

도움을 주셔서 대단히 감사드립니다.

답변

1

나는 내 시스템에서 작업을하고 검색을 위해 특별 클래스를 생성 :

public IQueryable<Task> Filter(IQueryable<Task> tasks) 
{ 
    return 
     FilterDates(
     FilterAssignedTo(
     FilterGroups(
     FilterOperationSystems(
     FilterPlatforms(
     FilterPriorities(
     FilterSeverities(
     FilterVersionsResolved(
     FilterVersionsReported(
     FilterTaskContent(
     FilterStatuses(tasks))))))))))); 
} 

이 필터링에 사용되는 방법 중 하나입니다 :

해당 클래스에서
public class TaskSearchCriteria 
{ 
    public List<int> Statuses { get; set; } 
    public List<int> Severities { get; set; } 
    public List<int> CreatedBy { get; set; } 
    public List<int> ClosedBy { get; set; } 
    public List<int> LastModificationBy { get; set; } 

    public DateTime? CreationDateFrom { get; set; } 
    public DateTime? CreationDateTo { get; set; } 

    public bool SearchInComments { get; set; } 
    public bool SearchInContent { get; set; } 
    public bool SearchInTitle { get; set; } 
} 

한 가지 방법은 필터를 적용

private IQueryable<Task> FilterSeverities(IQueryable<Task> tasks) 
{ 
    if (Severities.Contains(TaskSearchConsts.All) || (!Severities.Any())) 
     return tasks; 

    var expressions = new List<Expression>(); 

    if (Severities.Contains(TaskSearchConsts.Active)) 
     expressions.Add(_taskParameter.EqualExpression("Severity.IsActive", 1)); 

    return tasks.WhereIn(_taskParameter, "Severity.ID", Severities, expressions); 
} 

이것은 엔티티 프레임 워크이지만 nHibernate에서도 쉽게 위치를 추가 할 수 있습니다. IQuery에 대한 절.

내가 컨트롤러 방법을 검색하려면 :

[HttpPost] 
public ActionResult TaskSearch([Bind(Prefix = "Search")]TaskSearchCriteria criteria) 

필터링을위한 하나 개의 클래스를 갖는 것은 좋은, 그것은 직렬화하고 향후 사용을 위해 데이터베이스에 저장할 수 있기 때문이다. 이렇게하면 필터 매개 변수를 다시 사용할 수 있습니다.

당신은 것이다 : 목록이 비어 있으면

public class CarSearchCriteria 
{ 
    List<int> ListOfCarTypesIds; 
    List<int> ListOfCarBrandIds; 
    bool IsNew; 
    //and more 
} 

, 당신이 필터를 적용하지 않습니다.

0

많은 기준이 있다면 많은 조치 매개 변수를 전달하는 대신 클래스에서 캡슐화하는 것이 가장 좋습니다.

public claass JobsController : Controller 
{ 
    public IList<JobDto> Index(JobSearchCriteria criteria) 
    { 
     IList<JobDto> jobs = _jobs.Find(criteria); 
     //... 
    } 
} 

저장소 방법은 단순히 함께가는대로 된 IQueryable을 구축 기준을 통해 단계 : 예를 들어, 내가 지금 일하고 있어요 프로젝트는 다음과 같은 서명 작업이 있습니다. 이 특정 프로젝트는 Linq To Sql을 사용하지만 동일한 주체가 NHibernates Criteria API (또는 Linq to NH)를 사용하여 적용 할 수 있습니다.

관련 문제