2017-03-23 1 views
0

J'ai examiné les moyens possibles de retourner une information @model de View qui est de type IEnumerable de nouveau au contrôleur, de sorte que si je trier/filtrer sur une requête de la base de données, je peux affiner le retour chaque itération sans redémarrer avec une nouvelle liste complète renvoyée. Toutes les façons montrent que vous devez revenir en arrière basé sur le modèle [index] qui fonctionne si vous êtes dans une boucle for. Mais je travaille avec renvoyer la collection d'un @ HTML.ActionLink dans la section d'en-tête d'une table, donc il n'y a aucune indexation possible disponible. Mon installation WebAPI est basée sur this où ils montrent comment trier et filtrer. J'essaie de le rendre un peu plus complexe car après avoir filtré une liste basée sur ma requête DB d'origine, je pourrai trier (à partir d'un clickable-actionLink sur la colonne d'en-tête d'une table) de cette liste filtrée; où comme actuellement il serait juste trier à partir d'une nouvelle liste complète. La seule façon que je peux penser à faire ceci est de renvoyer (par un POST) au contrôleur la liste mise à jour de la customClass.ASP.NET passant List au contrôleur de IEnumerable @model inside En-tête de tableau ActionLink avec non-indexation

@ Html.ActionLink ("Nom", "Index", nouveau {orderBy = ViewBag.sortByName, companyListIds = modèle. ????})

Une meilleure option (sur la base commentaires de Tacud) qui nécessiterait une URL POST plus petite serait en retournant une liste des propriétés d'id seulement qui peut ensuite être appliquée à une requête. Mais c'est toujours une liste et doit encore être renvoyé sans un index de et ActionLink. Cela aidera à garder une trace et me permettre de continuer à creuser vers une liste de plus en plus petite. Ci-dessous des parties de ma classe de modèle, l'index Action du contrôleur et la vue d'index. espace de noms de modèle:

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; } 
} 

Controller Namespace:

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); 
    } 

Voir namespace:

@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

Pourquoi avez-vous besoin d'envoyer la liste de retour? Pourquoi n'appelez-vous pas la base de données et reconstruire la liste dans la méthode d'action du contrôleur POST? – Tacud

+0

@Tacud Il le fait déjà. Car si vous continuez à explorer (plusieurs filtres) à partir de la même page d'index, comment gérez-vous les filtres que vous avez déjà effectués? Mais comme indiqué dans la question, que faire si je clique sur une colonne d'en-tête pour trier/commander cette colonne quand il était déjà filtré par une recherche; il renvoie alors la liste complète triée pas celle qui a été filtrée. Une action à la fois, avec un moyen de préformer les actions sur le résultat. – Edward

+0

Il suffit de publier ces filtres et de construire la liste en fonction de ceux-ci. Si vous ne modifiez pas les valeurs de la table, vous ne devez pas renvoyer la liste entière. – Tacud

Répondre

0

d'abord obtenir la liste des numéros d'identification que je veux revenir après la contrôleur de l'affichage actuel montrant dans la page d'affichage WebAPI j'ai utilisé @Model.Select(x => x.Id)

Ma méthode d'index du contrôleur a été seulement changé par cette

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

Et mon avis ressemble à ceci:

@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>