Приложение MVC, Orderby не работает в Home Controller Index - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю над сортировкой индекса книг по дате их публикации в сочетании с параметрами поиска по ключевым словам.Я использую оператор switch, который выбирает перечисляемые значения, которые сообщают результаты поиска Action to Order по-разному, по возрастанию или по убыванию.Тем не менее, кажется, что Orderby не работает, но первое утверждение case работает.Независимо от того, что программа будет сортировать только по самым новым в первую очередь.Старшая первая не работает.

public IActionResult Index(String SearchString, Classification DateValueSign)
    {


        var query = from r in _db.Books select r;

        if (SearchString != null && SearchString != "")
        {
            query = query.Where(x => x.Title.Contains(SearchString) || x.Author.Contains(SearchString) || x.Genre.GenreName.Contains(SearchString));

        }
        switch (DateValueSign)
        {
            case Classification.NewestFirst:
                query = query.OrderByDescending(x => x.PublicationDate);
                break;
            case Classification.OldestFirst:
                query = query.OrderBy(x => x.PublicationDate);
                break;
            case Classification.MostPopular:
                query = query.OrderByDescending(x => x.AverageRating);
                break;
            case Classification.LeastPopular:
                query = query.OrderBy(x => x.AverageRating);
                break;
        }
        List<Book> SelectedBooks = new List<Book>();
        SelectedBooks = query.ToList();
        ViewBag.SelectedBooks = SelectedBooks.Count();
        ViewBag.TotalBooks = _db.Books.Count();

        return View(SelectedBooks);
    } 

Вот представление для индекса.Быстрый поиск на странице индекса.

@model IEnumerable<fa18team16BevoBookStore.Models.Book>
@{
    ViewData["Title"] = "View";
}
@using fa18team16BevoBookStore.Controllers
<!--This is the quick search box code-->
<form asp-action="Index" asp-controller="Home" method="get">
    <p class="form-group">
        Search: <input name="SearchString" class="form-control" /><br />
        <button type="submit" class="btn btn-secondary">Search</button>
        <a asp-action="Index" class="btn btn-danger">Show All</a>
    </p>
</form>
<p>Displaying @ViewBag.SelectedBooks out of @ViewBag.TotalBooks </p>
<h2>View</h2>
<div class="form-group">
    <label class="radio">@Html.RadioButton("DateValueSign", 
Classification.NewestFirst)Newest First</label>
    <label class="radio">@Html.RadioButton("DateValueSign", 
Classification.OldestFirst)Oldest First</label>
    <label class="radio">@Html.RadioButton("DateValueSign", 
Classification.MostPopular)Most Popular</label>
    <label class="radio">@Html.RadioButton("DateValueSign", 
Classification.LeastPopular)Least Popular</label>
</div>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.UniqueID)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Author)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.BookQuantity)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.UniqueID)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Author)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Description)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.BookQuantity)
                </td>
                <td>
                    <a asp-action="Details" asp-route- 
id="@item.BookID">Details</a>
                </td>
            </tr>
        }
    </tbody>
</table>

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Для вашей проблемы это вызвано тем, что вы помещаете <label class="radio">@Html.RadioButton("DateValueSign", Classification.NewestFirst)Newest First</label> вне <form asp-action="Index" asp-controller="Home" method="get">, а затем, независимо от того, что вы выбрали для DateValueSign, оно никогда не передается контроллеру и использует значение по умолчанию для Classification.

Переместите @Html.RadioButton в form как

<form asp-action="Index" asp-controller="Model" method="get">
    <p class="form-group">
        Search: <input name="SearchString" class="form-control" /><br />
        <div class="form-group">
            <label class="radio">
                @Html.RadioButton("DateValueSign", Classification.NewestFirst)Newest First
            </label>
            <label class="radio">
                @Html.RadioButton("DateValueSign", Classification.OldestFirst)Oldest First
            </label>
            <label class="radio">
                @Html.RadioButton("DateValueSign", Classification.MostPopular)Most Popular
            </label>
            <label class="radio">
                @Html.RadioButton("DateValueSign", Classification.LeastPopular)Least Popular
            </label>
        </div>

        <button type="submit" class="btn btn-secondary">Search</button>
        <a asp-action="Index" class="btn btn-danger">Show All</a>
    </p>
</form>
0 голосов
/ 30 ноября 2018

Во-первых, самая распространенная причина, по которой перечисление всегда имеет одно и то же значение, заключается в том, что значение было присвоено неправильно, поэтому оно назначается в качестве значения по умолчанию.Значение по умолчанию для перечисления 0, это самое первое значение, которое вы определили в своем перечислении Classification.В вашем случае NewestFirst кажется по умолчанию.Такое поведение означает, что значение DateValueSign не передается.

Во-вторых, для устранения проблем, которые могут быть связаны с рендерами Razor, всегда проверяйте элемент inspect для проверки сгенерированного кода.В-третьих, при решении таких проблем на стороне сервера, как операторы case, отладчик очень удобен.

Что касается вашей проблемы, MVC требуется значение число вашего перечисления, в противном случае оно по умолчанию равно 0. Если вы отметите свои переключатели в элементе проверки, вы заметите атрибут valueпоказывает строку типа value="LeastPopular", когда она должна показывать что-то вроде value="3".Это происходит потому, что функция RadioButton принимает любое перечисление, назначенное в виде строки.Чтобы достичь этого, просто бросьте каждое ваше перечисление в бритву как int.

Например, это:

 <label class="radio">@Html.RadioButton("DateValueSign", Classification.NewestFirst)Newest First</label>

Становится так:

<label class="radio">@Html.RadioButton("DateValueSign", (int) Classification.NewestFirst)Newest First</label>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...