2017-03-23 37 views
0

我一直在審查可能的方式來返回一個視圖的@model類型IEnumerable信息返回到控制器,所以如果我對來自數據庫的查詢進行排序/過濾,我可以優化每次迭代的返回,而無需重新啓動,並返回新的完整列表。所有的方法都顯示你需要基於model [index]來回發POST,如果你在for循環中,它就可以工作。但是我正在將表單標題部分中的@ HTML.ActionLink發送回收集,因此沒有可用的索引。ASP.NET將列表傳遞給控制器​​從IEnumerable @model內部表格標題ActionLink與非索引

我的WebAPI設置基於this,他們展示瞭如何排序和過濾。我試圖讓它更復雜一些,因爲在基於原始數據庫查詢篩選列表後,我將能夠從該篩選列表中排序(來自表格標題列上的clickable-actionLink);目前它只是從新的完整列表中排序。

我能想到的唯一方法就是通過POST傳遞給控制器​​更新的customClass列表。

@ Html.ActionLink( 「名稱」, 「索引」,新{ORDERBY = ViewBag.sortByName, companyListIds =模型。????})

一個更好的選擇(基於來自Tacud的評論)將需要較小的POST URL將通過僅返回可以應用於查詢的id屬性的列表。但它仍然是一個列表,並且仍然需要發回,而沒有來自ActionLink的索引。這將有助於保持跟蹤,並讓我繼續深入到越來越小的名單。

下面是我的模型類的一部分,控制器的索引Action和索引視圖。 型號命名空間:

public class Company 
{ 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

控制器命名空間:

public async Task<IActionResult> Index(ICollection<int> prev, string orderBy , string searchCategory ="", string searchString = "") 
    { 
     List<string> Categories = new List<string>() { "Name", "City", "State", "Zip", "Contact Person" }; 
     ViewBag.searchCategory = new SelectList(Categories); 
     ViewBag.sortByName = orderBy == null ? "name" : orderBy == "name" ? "namedesc" : "name"; 
     ViewBag.sortByCity = orderBy == "city" ? "citydesc" : "city"; 
     ViewBag.sortByState = orderBy == "state" ? "statedesc" : "state"; 
     ViewBag.companyIndex = companyList.Count==0 ? await _context.Company.ToListAsync() : companyList ; 

     List<Company> resultSet = new List<Company>(ViewBag.companyIndex); 

     if (!String.IsNullOrEmpty(searchCategory) && !String.IsNullOrEmpty(searchString)) 
     { 
      switch (searchCategory) 
      { 
      ..... 
      } 
     } 

     switch (orderBy) 
     { 
      .... 
     } 

     return View(resultSet); 
    } 

查看命名空間:

@model IEnumerable<Laier_It.Models.Company> <p> 
@using (Html.BeginForm() { 
<p> 
    Search By: @Html.DropDownList("SearchCategory", "") 
    Search For: @Html.TextBox("SearchString") 
    <input type="submit" value="Filter" /> 
</p> } 
<table class="table "> 
    <thead> 
     <tr> 
      <th> 
       @Html.ActionLink("Name", "Index", new { orderBy = ViewBag.sortByName, companyList = Model }) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.Address) 
      </th> 
      <th> 
       @Html.ActionLink("City", "Index", new { orderBy = ViewBag.sortByCity, companyList = Model }) 
      </th> 
      <th> 
       @Html.ActionLink("State", "Index", new { orderBy = ViewBag.sortByState, companyList = Model }) 
      </th> </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.Name) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Address) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.City) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.State) 
       </td> </tr> 
     } 
    </tbody> 
</table> 
+0

爲什麼你需要發送列表回來?爲什麼不調用數據庫並在POST控制器操作方法中再次構建列表? – Tacud

+0

@Tacud它已經做到了。因爲如果您繼續從同一個索引頁向下鑽取(多個過濾器),您如何跟蹤您已經完成的過濾器?但正如問題中所述,如果我點擊一個標題列來對該列進行排序/排序,那麼當它已經被搜索過濾時,該怎麼辦;它然後返回排序完整的列表,而不是已經過濾的列表。一次只能執行一個操作,需要預先對結果執行操作。 – Edward

+0

只需回發這些過濾器並基於它們構建列表。如果您不編輯表格值,則不應將整個列表發送回去。 – Tacud

回答

0

首先獲得標識的名單,我要回發到顯示在WebAPI視圖頁面中的當前再現的控制器我使用了@Model.Select(x => x.Id)

我控制器指數方法只是通過這個

var resultSet = prev.Count == 0 ? await _context.Company.ToListAsync() : 
       await _context.Company.Where(x => prev.Contains(x.Id)).ToListAsync(); 

改變我的搜索是這樣的:

@model IEnumerable<Laier_It.Models.Company> 

@using (Html.BeginForm()) 
{ 
    <p> 
     Search By: @Html.DropDownList("SearchCategory", "") 
     Search For: @Html.TextBox("SearchString") 
     <input type="submit" value="Filter" /> 
    </p> 
} 

<table class="table "> 
    <thead> 
     <tr> 
      <th> 
       @Html.ActionLink("Name", "Index", new { orderBy = ViewBag.sortByName, prev = @Model.Select(x => x.Id) }) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.Address) 
      </th> 
      <th> 
       @Html.ActionLink("City", "Index", new { orderBy = ViewBag.sortByCity, prev = @Model.Select(x => x.Id) }) 
      </th> 
      <th> 
       @Html.ActionLink("State", "Index", new { orderBy = ViewBag.sortByState, prev = @Model.Select(x => x.Id) }) 
      </th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.Name) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Address) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.City) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.State) 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 
相關問題