1

我開發指的是例如Sorting, filtering, paging, and grouping - EF Core with ASP.NET Core MVC tutorial (3 of 10)添加分頁鏈接使用多個搜索字符串ASP.NET核心的Visual Studio 2017年查看 - 在

在我的索引頁我用3分頁索引視圖搜索字符串不攝搜索字符串。

排序工作得很好,但沒有搜索參數。 只要我在輸入搜索字符串後嘗試排序,沒有任何工作。 應該接管搜索字符串。它並不愉快。

插入搜索字符串後再分頁無法正常工作。名爲CurrentFilterxxx的ViewData元素爲視圖提供當前的過濾器字符串。該值必須包含在分頁鏈接中,以便在分頁過程中保持過濾器設置,並且在頁面重新顯示時必須將其恢復到文本框。 在我的情況下,它不起作用。

這裏我控制器類的Index方法:

public async Task<IActionResult> Index(
     string sortOrder, 
     string searchStringComune, 
     string searchStringProvincia, 
     string searchStringRegione, 
     string searchString, 
     string currentFilter, 
     int? page) 
    { 
     ViewData["CurrentSort"] = sortOrder; 
     ViewData["ComuneSortParm"] = String.IsNullOrEmpty(sortOrder) ? "comune" : ""; 
     ViewData["ProvinciaSortParm"] = String.IsNullOrEmpty(sortOrder) ? "provincia" : ""; 
     ViewData["RegioneSortParm"] = String.IsNullOrEmpty(sortOrder) ? "regione" : ""; 
     ViewData["PostalCodeSortParm"] = String.IsNullOrEmpty(sortOrder) ? "CAP" : ""; 
     ViewData["AbitantsSortParm"] = String.IsNullOrEmpty(sortOrder) ? "abitanti" : ""; 

     if (searchStringComune != null || 
      searchStringProvincia != null || 
      searchStringRegione != null || 
      searchString != null) 
     { 
      page = 1; 
      if (searchStringComune != null) 
      { 
       searchString = searchStringComune; 
      } 
      if (searchStringProvincia != null) 
      { 
       searchString = searchStringProvincia; 
      } 
      if (searchStringRegione != null) 
      { 
       searchString = searchStringRegione; 
      } 
     } 
     else 
     { 
      searchString = currentFilter; 
     } 

     ViewData["CurrentFilterComune"] = searchStringComune; 
     ViewData["CurrentFilterProvincia"] = searchStringProvincia; 
     ViewData["CurrentFilterRegione"] = searchStringRegione; 
     ViewData["CurrentFilter"] = searchString; 

     var comuni = from s in _context.Listacomuniitaliani 
         select s; 

     if (!String.IsNullOrEmpty(searchStringComune) || 
      !String.IsNullOrEmpty(searchStringProvincia) || 
      !String.IsNullOrEmpty(searchStringRegione)) 
     { 

      comuni = comuni.Where(s => s.Comune.Equals(searchStringComune) || 
             s.Provincia.Equals(searchStringProvincia) || 
             s.Regione.Equals(searchStringRegione)); 
     } 

     switch (sortOrder) 
     { 
      case "comune": 
       comuni = comuni.OrderByDescending(s => s.Comune); 
       break; 
      case "provincia": 
       comuni = comuni.OrderBy(s => s.Provincia); 
       break; 
      case "regione": 
       comuni = comuni.OrderBy(s => s.Regione); 
       break; 
      case "CAP": 
       comuni = comuni.OrderBy(s => s.Cap); 
       break; 
      case "abitanti": 
       comuni = comuni.OrderBy(s => s.Abitanti); 
       break; 
      default: 
       comuni = comuni.OrderBy(s => s.Comune); 
       break; 
     } 

     int pageSize = 7; 
     return View(await PaginatedList<Listacomuniitaliani>.CreateAsync(comuni.AsNoTracking(), page ?? 1, pageSize)); 
    } 

在這裏,我的指數代碼:

@model PaginatedList<MyProjectName.Models.Listacomuniitaliani> 

@{ViewData["Title"] = "Index";} 

<h2>Index</h2> 

<p> 
<a asp-action="Create">Create New</a> 
</p> 

<form asp-action="Index" method="get"> 
    <div class="form-actions no-color"> 
     <p> 
      Cerca un comune: <input type="text" name="SearchStringComune" value="@ViewData["currentFilterComune"]" /> 
      <input type="submit" value="trova" class="btn btn-default" /> 
     </p> 
    </div> 
</form> 

<form asp-action="Index" method="get"> 
<div class="form-actions no-color"> 
    <p> 
     Seleziona una provincia: <input type="text" name="SearchStringProvincia" value="@ViewData["currentFilterProvincia"]" /> 
     <input type="submit" value="trova" class="btn btn-default" /> 
    </p> 
</div> 

<form asp-action="Index" method="get"> 
<div class="form-actions no-color"> 
    <p> 
     Seleziona una regione: <input type="text" name="SearchStringRegione" value="@ViewData["currentFilterRegione"]" /> 
     <input type="submit" value="trova" class="btn btn-default" /> 
    </p> 
</div> 

<form asp-action="Index" method="get"> 
<div class="form-actions no-color"> 
    <p> 
     <a asp-action="Index">Torna indietro alla lista</a> 
    </p> 
</div> 

<table class="table"> 
<thead> 
    <tr> 
      <th> 
       Istat 
      </th> 
      <th> 
        <a asp-action="Index" asp-route-sortOrder="@ViewData["ComuneSortParm"]" 
         asp-route-currentFilterComune="@ViewData["CurrentFilterComune"]">Comune</a>      
    </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["ProvinciaSortParm"]" 
        asp-route-currentFilterProvincia="@ViewData["CurrentFilterProvincia"]">Provincia</a> 
      </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["RegioneSortParm"]" 
        asp-route-currentFilterRegione="@ViewData["CurrentFilterRegione"]">Regione</a> 
      </th> 
      <th> 
       Prefisso 
      </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["PostalCodeSortParm"]">CAP</a> 
      </th> 
      <th> 
       CodFisco 
      </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["AbitantsSortParm"]">Abitanti</a> 
      </th> 
      <th> 
       Link 
      </th> 
     <th></th> 
    </tr> 
</thead> 
<tbody> 
@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Istat) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Comune) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Provincia) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Regione) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Prefisso) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Cap) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.CodFisco) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Abitanti) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Link) 
     </td> 
     <td> 
      <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | 
      <a asp-action="Details" asp-route-id="@item.Id">Details</a> | 
      <a asp-action="Delete" asp-route-id="@item.Id">Delete</a> 
     </td> 
    </tr> 
    } 
</tbody> 
</table> 

@{ 
var prevDisabled = !Model.HasPreviousPage ? "disabled" : ""; 
var nextDisabled = !Model.HasNextPage ? "disabled" : ""; 
} 


<a asp-action="Index" 
asp-route-sortOrder="@ViewData["CurrentSort"]" 
asp-route-page="@(Model.PageIndex - 1)" 
@*asp-route-currentFilter="@ViewData["CurrentFilter"]"*@ 
asp-route-currentFilterComune="@ViewData["CurrentFilterComune"]" 
asp-route-currentFilterRegione="@ViewData["CurrentFilterRegione"]" 
asp-route-currentFilterProvincia="@ViewData["CurrentFilterProvincia"]" 
class="btn btn-default @prevDisabled"> 
Previous 
</a> 

<a asp-action="Index" 
asp-route-sortOrder="@ViewData["CurrentSort"]" 
asp-route-page="@(Model.PageIndex + 1)" 
@*asp-route-currentFilter="@ViewData["CurrentFilter"]"*@ 
asp-route-currentFilterComune="@ViewData["CurrentFilterComune"]" 
asp-route-currentFilterRegione="@ViewData["CurrentFilterRegione"]" 
asp-route-currentFilterProvincia="@ViewData["CurrentFilterProvincia"]" 
class="btn btn-default ifextDisabled"> 
Next 
</a> 

標籤幫手asp-route-currentFilter一直沒有used.Instead,我已經使用了更具體的標籤幫手;例如asp-route-currentFilterComune

任何幫助表示讚賞。

回答

1

我有它的工作。 要做到這一點,我不得不重新設計控制器的一部分,並對視圖代碼進行了一些修改。 處理多個搜索字符串對我而言頗具挑戰性。

這裏我的新控制器指數法:

public async Task<IActionResult> Index(
     string sortOrder, 
     string searchStringComune, 
     string searchStringProvincia, 
     string searchStringRegione, 
     string searchString, 
     string currentFilter, 
     int? page) 
    { 
     ViewData["CurrentSort"] = sortOrder; 
     ViewData["ComuneSortParm"] = String.IsNullOrEmpty(sortOrder) ? "comune" : ""; 
     ViewData["ProvinciaSortParm"] = String.IsNullOrEmpty(sortOrder) ? "provincia" : ""; 
     ViewData["RegioneSortParm"] = String.IsNullOrEmpty(sortOrder) ? "regione" : ""; 
     ViewData["PostalCodeSortParm"] = String.IsNullOrEmpty(sortOrder) ? "CAP" : ""; 
     ViewData["AbitantsSortParm"] = String.IsNullOrEmpty(sortOrder) ? "abitanti" : ""; 


     if (searchStringComune != null || 
      searchStringProvincia != null || 
      searchStringRegione != null || 
      searchString != null) 
     { 
      page = 1; 
     } 
     else 
     { 
      searchStringProvincia = currentFilter; 
      searchStringRegione = currentFilter; 

      foreach (ItalianRegions itemRegion in Enum.GetValues(typeof(ItalianRegions))) 
      { 
       if (searchStringRegione == itemRegion.ToString()) 
       { 
        searchStringProvincia = null; 
       } 
      } 

      foreach (ItalianComunes itemComune in Enum.GetValues(typeof(ItalianComunes))) 
      { 
       if (searchStringProvincia == itemComune.ToString()) 
       { 
        searchStringRegione = null; 
       } 
      } 

     } 


     ViewData["CurrentFilterComune"] = searchStringComune; 
     ViewData["CurrentFilterProvincia"] = searchStringProvincia; 
     ViewData["CurrentFilterRegione"] = searchStringRegione; 
     ViewData["CurrentFilter"] = searchString; 

     var comuni = from s in _context.Listacomuniitaliani 
         select s; 

     if (!String.IsNullOrEmpty(searchStringComune) || 
      !String.IsNullOrEmpty(searchStringProvincia) || 
      !String.IsNullOrEmpty(searchStringRegione)) 
     { 
      comuni = comuni.Where(s => s.Comune.Equals(searchStringComune) || 
             s.Provincia.Equals(searchStringProvincia) || 
             s.Regione.Equals(searchStringRegione)); 
     } 

     switch (sortOrder) 
     { 
      case "comune": 
       comuni = comuni.OrderByDescending(s => s.Comune); 
       break; 
      case "provincia": 
       comuni = comuni.OrderBy(s => s.Provincia); 
       break; 
      case "regione": 
       comuni = comuni.OrderBy(s => s.Regione); 
       break; 
      case "CAP": 
       comuni = comuni.OrderBy(s => s.Cap); 
       break; 
      case "abitanti": 
       comuni = comuni.OrderBy(s => s.Abitanti); 
       break; 
      default: 
       comuni = comuni.OrderBy(s => s.Comune); 
       break; 
     } 


     int pageSize = 7; 
     return View(await PaginatedList<Listacomuniitaliani>.CreateAsync(comuni.AsNoTracking(), page ?? 1, pageSize)); 
    } 

我已經將循環使用2個不同的enum搜索字符串能夠正確設置,而分頁搜索字段中烤焦字符串文本。

這裏Index代碼:

@model PaginatedList<MyProject.Models.Listacomuniitaliani> 

@{ 
ViewData["Title"] = "Index"; 
} 

<h2>Index</h2> 

<p> 
<a asp-action="Create">Create New</a> 
</p> 

<form asp-action="Index" method="get"> 
    <div class="form-actions no-color"> 
     <p> 
      Cerca un comune: <input type="text" name="searchStringComune" value="@ViewData["CurrentFilterComune"]" /> 
      <input type="submit" value="trova" class="btn btn-default" /> 
     </p> 
    </div> 
</form> 


<form asp-action="Index" method="get"> 
<div class="form-actions no-color"> 
    <p> 
     Seleziona una provincia: <input type="text" name="searchStringProvincia" value="@ViewData["CurrentFilterProvincia"]" /> 
     <input type="submit" value="trova" class="btn btn-default" /> 
    </p> 
    </div> 
</form> 

<form asp-action="Index" method="get"> 
    <div class="form-actions no-color"> 
    <p> 
     Seleziona una regione: <input type="text" name="searchStringRegione" value="@ViewData["CurrentFilterRegione"]" /> 
     <input type="submit" value="trova" class="btn btn-default" /> 
    </p> 
    </div> 
</form> 

<form asp-action="Index" method="get"> 
    <div class="form-actions no-color"> 
    <p> 
     <a asp-action="Index">Torna indietro alla lista</a> 
    </p> 
    </div> 
</form> 


<table class="table"> 
    <thead> 
    <tr> 
      <th> 
       Istat 
      </th> 
      <th> 
        <a asp-action="Index" asp-route-sortOrder="@ViewData["ComuneSortParm"]">Comune</a> 
      </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["ProvinciaSortParm"]" 
        asp-route-currentFilter="@ViewData["CurrentFilterProvincia"]">Provincia</a> 
      </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["RegioneSortParm"]" 
        asp-route-currentFilter="@ViewData["CurrentFilterRegione"]">Regione</a> 
      </th> 
      <th> 
       Prefisso 
      </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["PostalCodeSortParm"]">CAP</a> 
      </th> 
      <th> 
       CodFisco 
      </th> 
      <th> 
       <a asp-action="Index" asp-route-sortOrder="@ViewData["AbitantsSortParm"]">Abitanti</a> 
      </th> 
      <th> 
       Link 
      </th> 
     <th></th> 
    </tr> 
    </thead> 
    <tbody> 

    @foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Istat) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Comune) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Provincia) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Regione) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Prefisso) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Cap) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.CodFisco) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Abitanti) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Link) 
     </td> 
     <td> 
      <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | 
      <a asp-action="Details" asp-route-id="@item.Id">Details</a> | 
      <a asp-action="Delete" asp-route-id="@item.Id">Delete</a> 
     </td> 
    </tr> 
    } 
    </tbody> 
    </table> 

    @{ 
    var prevDisabled = !Model.HasPreviousPage ? "disabled" : ""; 
    var nextDisabled = !Model.HasNextPage ? "disabled" : ""; 
    } 


<a asp-action="Index" 
    asp-route-sortOrder="@ViewData["CurrentSort"]" 
    asp-route-page="@(Model.PageIndex - 1)" 
    [email protected] (@ViewData["CurrentFilterRegione"] != null) 
    { 
     @ViewData["CurrentFilterRegione"] 
    } else 
    { 
     @ViewData["CurrentFilterProvincia"] 
    } 
    class="btn btn-default @prevDisabled"> 
    Previous 
</a> 
<a asp-action="Index" 
    asp-route-sortOrder="@ViewData["CurrentSort"]" 
    asp-route-page="@(Model.PageIndex + 1)" 
    [email protected] (@ViewData["CurrentFilterRegione"] != null) 
    { 
     @ViewData["CurrentFilterRegione"] 
    } else 
    { 
    @ViewData["CurrentFilterProvincia"] 
    } 
    class="btn btn-default @nextDisabled"> 
    Next 
</a> 

現在,它完美的作品。排序工作。分頁工作,維護搜索字符串文本。

相關問題