2012-09-12 3 views
4

webgrid를 설정했는데 제대로 작동하여 페이지를 정렬하고 페이지 할 수 있습니다. 나는 또한 필터가 잘 작동하는 필터 옵션을 추가했습니다. 다음에을 정렬하면 필터가 손실되고 모든 레코드가 표시됩니다. 내 작업을 여기에Webgrid : 정렬 후 필터 유지

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "Get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" })) 
{ 

@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Document Search</legend> 

    <div class="editor-label"> 
     @Html.Label("Enter a Document code:") 
    </div> 
    <div class="editor-field"> 
     @Html.Editor("search") 
    </div> 

    <p> 
     <input type="submit" value="Search" /> 
    </p> 
</fieldset> 
} 

@{ 
    WebGrid grid = new WebGrid(null, rowsPerPage: 10, canPage: true, canSort: true, ajaxUpdateContainerId: "myGrid"); 
    grid.Bind(Model, autoSortAndPage: true); 
} 

<div id="myGrid"> 

    @grid.GetHtml(mode: WebGridPagerModes.All, firstText: "First Page", nextText: "Next", previousText: "Previous", lastText: "Last Page", numericLinksCount: 10, 
      columns: grid.Columns(
       grid.Column("DocumentID", "Document Code", canSort: true), 
       grid.Column("Title", "Document Title", canSort: true) 
     ) 
    ) 

</div> 

: 그리고 내가 표시된 레코드를 정렬 할 때

public ActionResult Index(string search) 
    { 
     List<DocumentIndexViewModel> viewModel = Mapper.Map<List<DocumentIndexViewModel>>(DocumentService.GetDocumentsBySearch(search)); 
     if (Request.IsAjaxRequest()) 
      return PartialView("_IndexGrid", viewModel); 
     else 
      return View(viewModel); 
    } 

가 어떻게 필터를 유지합니까 여기

내 면도기보기 코드? 어떻게 든 정렬 링크에 검색 문자열을 추가해야하지만 진행 방법을 모르겠다.

+0

좋은 질문입니다. . . – Andrei

답변

3

필터에 GET을 사용하고 있으므로 필터가 보존되어야합니다. 문제를 재현 할 수 없습니다. 여기에 제 전체 테스트 케이스가 있습니다.

모델 :

public class CityViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

컨트롤러 :

public class HomeController : Controller 
{ 
    public ActionResult Index(string search) 
    { 
     using (var client = new WebClient()) 
     { 
      var query = HttpUtility.ParseQueryString(string.Empty); 
      query["q"] = search; 
      var json = client.DownloadString("http://gd.geobytes.com/AutoCompleteCity?" + query.ToString()); 
      var serializer = new JavaScriptSerializer(); 
      var viewModel = serializer 
       .Deserialize<string[]>(json) 
       .Select((x, index) => new CityViewModel 
       { 
        Id = index, 
        Name = x 
       }) 
       .Where(x => x.Name.StartsWith(search ?? string.Empty, StringComparison.OrdinalIgnoreCase)) 
       .ToList(); 

      if (Request.IsAjaxRequest()) 
      { 
       return PartialView("_IndexGrid", viewModel); 
      } 
      else 
      { 
       return View(viewModel); 
      } 
     } 
    } 
} 

메인 뷰 (~/Views/Home/Index.cshtml) 부분

@model IEnumerable<CityViewModel> 

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    $.ajaxSetup({ 
     cache: false 
    }); 
</script> 

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "GET", InsertionMode = InsertionMode.Replace, UpdateTargetId = "gridPartial" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Document Search</legend> 

     <div class="editor-label"> 
      @Html.Label("Enter a Document code:") 
     </div> 
     <div class="editor-field"> 
      @Html.Editor("search") 
     </div> 

     <p> 
      <input type="submit" value="Search" /> 
     </p> 
    </fieldset> 
} 

<div id="gridPartial"> 
    @Html.Partial("_IndexGrid") 
</div> 

~/Views/Home/_IndexGrid.cshtml :

@model IEnumerable<CityViewModel> 

@{ 
    WebGrid grid = new WebGrid(null, rowsPerPage: 10, canPage: true, canSort: true, ajaxUpdateContainerId: "myGrid"); 
    grid.Bind(Model, autoSortAndPage: true); 
} 

<div id="myGrid"> 
    @grid.GetHtml(mode: WebGridPagerModes.All, firstText: "First Page", nextText: "Next", previousText: "Previous", lastText: "Last Page", numericLinksCount: 10, 
     columns: grid.Columns(
      grid.Column("Id", "City Id", canSort: true), 
      grid.Column("Name", "City Name", canSort: true) 
     ) 
    ) 
</div> 

정렬 및 페이지 매김은 쿼리 문자열에 있기 때문에 입력 한 검색 필터를 보존합니다.

+0

그리드의 정렬 헤더 링크에 href의 검색 문자열이 있다고 말하는가? 내 것은 '#'이있는 것 같습니다. – James

+0

브라우저 주소창을 보지 마십시오. 실제로 서버로 전송 된 것을보십시오. AJAX로 보내지는 정확한 요청을 분석하십시오. 여기에는 검색 쿼리 문자열 매개 변수가 들어 있습니다. 따라서 필터는 링크의 href에 전혀 저장되지 않습니다. 이러한 링크에는 AJAX 요청을 트리거하는 검색 쿼리 조건을 서버에 적절하게 보내는 onclick 자바 스크립트 이벤트가 있습니다. –

+0

그런 경우에는 컨트롤러 작업에서 요청 값을 가져와야합니까? – James

관련 문제