>

나는 MVC를 처음 접했고 어떤 도움이라도 대단히 감사하겠습니다. 현재 데이터 테이블을 표시하는 페이지가 있습니다. 클릭하면 페이지에 추가 필터를 추가하는 버튼을 추가하고 싶습니다. 다시 클릭하면 필터가 해제됩니다 (전환 기능).

아래는 내가 사용하려는 코드의 미리보기입니다. 뷰가 원하는대로 작동한다고 생각하지만 컨트롤러에 대해서는 잘 모르겠습니다.

보기 버튼 :

  <td width="15%">
        @if (ViewBag.curStatus == "NotFiltered")
        {
            @Html.ActionLink("Filter", "Index", new
       {
           sortOrder = ViewBag.CurrentSort,
           qryStatus = ""
       }, new { @class = "btn btn-primary btn-xs" })
        }
        else
        {
            @Html.ActionLink("Filter", "Index", new
       {
           sortOrder = ViewBag.CurrentSort,
           qryStatus = "Filtered"
       }, new { @class = "btn btn-default btn-xs" })
        }
    </td>

컨트롤러 :

public ActionResult Table(string sortOrder, string currentFilter, string searchString, int? page)
        {
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? 
              "invlocation" : "";
            ViewBag.curStatus = String.IsNullOrEmpty(sortOrder) ? 
              "NotFiltered" : "Filtered";
        var samples = from s in db.Table1
                      select s;
            switch (sortOrder)
            {
                case "NotFiltered":
                   string selectqry = "select * from Table1 where datereceived is null ";
                   selectqry = selectqry + " and submissionid not in (select id from Table2 where status='Done')";
                   break;
                case "Filtered":                   
                   selectqry = selectqry + " and status <> 'Pending'";
                   break;
            }
            List<vFiltered> list = db.Table1.SqlQuery(selectqry).ToList();
            int pageSize = 10;
            int pageNumber = (page ?? 1);
            return View(vFiltered.ToPagedList(pageNumber, pageSize));
        }


  • 답변 # 1

    내가 언급 한 첫 번째 것은 MVC 패턴이 약간 느슨하고 컨트롤러에 내가 선택하는 것보다 훨씬 많은 코드가 있다는 것입니다.

    내 선호와 IMO의 더 나은 접근 방식은 로직을 비즈니스 계층 또는 저장소로 옮기는 것입니다.

    저장소/쿼리 :

    string selectqry = "select * from Table1 where datereceived is null ";
    
    

    항상 발생하므로 if/case 문 외부에 있어야합니다.

    Entity Framework를 사용하지 않고 수동으로 쿼리를 작성하려는 경우 다음을 수행 할 수 있습니다.

    switch (sortOrder)
            {
                case "NotFiltered":
                   selectqry = selectqry + " and submissionid not in (select id from Table2 where status='Done')";
                   break;
                case "Filtered":                   
                   selectqry = selectqry + " and status <> 'Pending'";
                   break;
            }
    
    

    약간 더 깨끗하게 :

    Dictionary<string, string> filters = new Dictionary<string, string>() 
    {
        {"NotFiltered",  "and submissionid not in (select id from Table2 where status='Done')"},
        {"Filtered", " and status <> 'Pending'"}
    }
    
    

    그리고 :

    string selectqry = "select * from Table1 where datereceived is null ";
    selectqry += filters[sortOrder];
    
    

    왜 정렬 순서라는 필터가 있습니까?

    여전히 SQL 문자열을 완전히 버리고 dbContext (Entity Framework 가정)를 설정하고 다음과 같이하십시오 :

    var results = dbContext.Table1;
    if (sortOrder == "NotFiltered")
    {
        results.where(x => !dbContext.Table2.Select(s => s.Id).Contains(x.Id);
    }
    else
    {
        results.where(x => x.Status != "Pending");
    }
    return results.ToList();
    
    

  • 이전 cordova - 여러 도메인에 대한 Azure AD 인증
  • 다음 iphone - 편집 모드의 사용자 정의 UITableViewCell이 UILabels를 이동하지 않습니다