none
Kann man Daten gleichzeitig filtern und sortieren? [MVC] RRS feed

  • Frage

  • Hey,

    ich habe mich kürzlich daran versucht, Filter- und Sortierfunktionen zu programmieren. Dafür gibt es ja auch ganz schöne Tutorials, die ich soweit auch alle hinbekommen habe.

    Mir ist nun aber aufgefallen, dass, wenn ich zum Beispiel nach einem Schüler mit dem Buchstaben 'A' suche und die angezeigten Ergebnisse nun sortieren möchte, alle Schüler wieder angezeigt werden.

    Gibt es einen Möglichkeit das zu verhindern? Also, dass nur die gefilterten Daten sortiert und angezeigt werden?

    Liebe Grüße

    View:

    <form asp-action="Index" method="get">    
    <div class="form-actions no-color">        
        <p>
            Find by name: <input type="text" name="SearchString" value="@ViewData["currentFilter"]" />            <input type="submit" value="Search" class="btn btn-default" />
            <a asp-action="Index">Back to Full List</a>
        </p>
    </div>
    </form>
    <table class="table">
        <thead>
            <tr>
                <th>
                    <a asp-action="Index" asp-route-sortOrder="@ViewData["NameSortParm"]">@Html.DisplayNameFor(model => model.LastName)</a>
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.FirstMidName)
                </th>
                <th>
                    <a asp-action="Index" asp-route-sortOrder="@ViewData["DateSortParm"]">@Html.DisplayNameFor(model => model.EnrollmentDate)</a>
                </th>
            </tr>
        </thead>
    (...)

    Controller:

    public async Task<IActionResult> Index(string sortOrder, string searchString)
            {
                ViewData["NameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
                ViewData["DateSortParm"] = sortOrder == "Date" ? "date_desc" : "Date";
                ViewData["CurrentFilter"] = searchString;
    
                var students = from s in _context.Students
                               select s;
                if (!String.IsNullOrEmpty(searchString))
                {
                    students = students.Where(s => s.LastName.Contains(searchString)
                                           || s.FirstMidName.Contains(searchString));
                }
                switch (sortOrder)
                {
                    case "name_desc":
                        students = students.OrderByDescending(s => s.LastName);
                        break;
                    case "Date":
                        students = students.OrderBy(s => s.EnrollmentDate);
                        break;
                    case "date_desc":
                        students = students.OrderByDescending(s => s.EnrollmentDate);
                        break;
                    default:
                        students = students.OrderBy(s => s.LastName);
                        break;
                }
                return View(await students.AsNoTracking().ToListAsync());
            }

    Donnerstag, 8. August 2019 09:53

Alle Antworten

  • Hi,

    bin mir nicht ganz sicher, ob das gemeint war, aber vielleicht so:

    public async Task<List<Student>> FilterAndSortAscendingAsync(string containsString) 
      => await _context.Students
        .Where(s => s.FirstMidName.Contains(containsString) || s.LastName.Contains(containsString));
        .OrderBy(s => s.LastName)
        .ThenBy(s => s.FirstMidName)
        .ToListAsync();

    Wenn du verschiedene Varianten in einer Methode abhandeln willst, könntest du auch eine enum definieren:

    public enum SortOption { None, Descending, Ascending }

    und diese dann als Parameter einbauen und die Methode entsprechend erweitern.

    Gruß


    • Bearbeitet K. Pater Donnerstag, 8. August 2019 16:16
    Donnerstag, 8. August 2019 16:16