Почему порядок сортировки в таблице делает представление на начальном этапе в моем приложении MVC - PullRequest
0 голосов
/ 02 июля 2018

Я хочу внедрить SortOrder в свой проект. На данный момент существует несколько проблем

  1. Если я нажму th, чтобы отсортировать элемент, A-Z не изменится, но элемент будет отсортирован. Чтобы сделать Z-A, мне снова нужно нажать th, и он снова сортирует элемент.

  2. В зависимости от страны USA ее данные заполняются в таблице при первой загрузке страницы. Но проблема в том, когда я меняю страну на UK или некоторые другие страны. Я получаю данные из базы данных по этим поискам.

  3. Теперь я снова хочу отсортировать th, но он перезагружает всю страницу, и страница переходит на начальный этап, когда раскрывающийся список Страна изменяется с UK на USA.

Пожалуйста, ведите меня. Я не знаю, где я иду не так. Заранее благодарю за помощь!

Модель

 public class CountryList
    {
        public int? Country { get; set; }
        public IEnumerable<SelectListItem> CountriesList { get; set; }
        public IEnumerable<CountryClass> Lists { get; set; }

    }
    public class CountryClass
    {
        public string NameInfo { get; set; }
        public string AddressInfo { get; set; }

        //Filter DropdownList
        [Display(Name = "Country")]
        public int? Country { get; set; }

    }

Контроллер

     [HttpGet]
     public ActionResult CountrySearch(int? country, string sortOrder, string currentFilter)
        {
            CountryList cls = new CountryList();
            CountryData db = new CountryData();
            IEnumerable<CountryClass> data;

            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParam = sortOrder == "Name" ? "name_desc" : "Name";
            ViewBag.breedingSortParam = sortOrder == "Address" ? "address_desc" : "Address";

            if (country != null)
            {
                data = db.CountryFilter(country.Value);
            }
            else
            {
                cls.Country = "USA";
                data = db.CountryFilter(country.Value);
            }

            switch (sortOrder)
            {

                case "Name":
                    data = data.OrderBy(s => s.NameInfo);
                    break;
                case "name_desc":
                    data = data.OrderByDescending(s => s.NameInfo);
                    break;
                case "Address":
                    data = data.OrderBy(s => s.AddressInfo);
                    break;
                case "address_desc":
                    data = data.OrderByDescending(s => s.AddressInfo);
                    break;
                default:
                    data = data.OrderBy(s => s.NameInfo);
                    break;
            }

            CountryList model = new CountryList
            {

            CountriesList = new List<SelectListItem>
            {

            new SelectListItem { Value = "1", Text = "Nepal" },
             new SelectListItem {Value = "120", Text = "India" },
             new SelectListItem {Value = "121", Text = "USA" },
             new SelectListItem { Value = "134", Text = "Australia" },
             new SelectListItem { Value = "137", Text = "UK" },
             }, 
                Lists = data
            };
            return View(model);
        }

View

@using (Html.BeginForm("CountrySearch", "CountrySearch", FormMethod.Get))
    {
    <div class="panel panel-default">
        <div class="panel-heading">
            Search By
        </div>
        <div class="panel-body">
            <div>
                @Html.DisplayNameFor(m => m.Country)
                @Html.DropDownListFor(m => m.Country, Model.CountriesList)
            </div>            
            <div>
                <button type="submit" class="btn btn-info">Search</button>
            </div>
        </div>
    </div>

}

<div class="col-md-6">
    <div class="panel panel-default">
        <div class="panel-heading">
            Details
        </div>
        <div class="panel-body">
            <table class="table table-hover">
                <tr>
                    <th>
                        @Html.ActionLink("Name", "CountrySearch", new { sortOrder = ViewBag.NameSortParam, currentFilter = ViewBag.CurrentFilter })
                        <i class="glyphicon @(ViewBag.CurrentSort== "name_desc" ? "glyphicon-sort-by-alphabet-alt" : "glyphicon-sort-by-alphabet")"></i>
                    </th>

                    <th>
                        @Html.ActionLink("Address", "CountrySearch", new { sortOrder = ViewBag.AddressSortParam, currentFilter = ViewBag.CurrentFilter })
                        <i class="glyphicon @(ViewBag.CurrentSort== "address_desc" ? "glyphicon-sort-by-alphabet-alt" : "glyphicon-sort-by-alphabet")"></i>
                    </th>

                </tr>
                @foreach (var item in Model.Lists)
            {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.NameInfo)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.AddressInfo)
                        </td>
                    </tr>
                }
            </table>
        </div>
    </div>
</div>

1 Ответ

0 голосов
/ 02 июля 2018

Как уже говорилось, ниже приведен пример того, как я составляю сортируемый список стран.

Создание необходимых классов.

//Forms view model.
public class CountrySearchViewModel
{
   public int? Country { get; set; }
   public List<CountryClass> CountriesList { get; set; }
   public string CurrentSortOrder { get; set; }
}

public class CountryClass
{
    public string NameInfo { get; set; }
    public string AddressInfo { get; set; }
}

Создайте главное представление (CountrySearch) с формой для отображения списка стран, который находится в частичном представлении. При этом форма используется для сериализации данных формы, а класс css выступает в качестве селектора JQuery. Затем мы выполняем запись ajax, чтобы отсортировать данные и заменить содержимое div вновь отсортированными данными.

@model CountrySearchViewModel

@{
    Layout = null;
}

<!DOCTYPE html>

<script src="~/Content/Scripts/jquery-2.2.3.js"></script>
<script src="~/Content/Scripts/jquery-ui-1.11.4.js"></script>

<script src="~/Content/Scripts/site.js"></script>
<script src="~/Content/Scripts/bootstrap.js"></script>


<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>CountrySearch</title>
</head>
<body>
    <form id="frmCountries" method="post">
        <div id="divSortedCountries">
            @Html.Partial("_SortedCountryData", Model)
        </div>
    </form>
</body>
</html>

<script>

    $(document).on('click', '.sortable-link', function () {
        var formData = $("#frmCountries").serialize();
        var sortUrl = $(this).data('sorturl');

        $.ajax({
            type: "POST",
            url: sortUrl,
            data: formData,
            success: function (data) {
                $("#divSortedCountries").html(data); 
            }
        });
    });

</script>

<style>
    .sortable-link {
        cursor:pointer;
    }
</style>

Добавить метод контроллера для возврата к представлению.

 [HttpGet]
 public ActionResult CountrySearch()
 {
    var model = new CountrySearchViewModel();

    //This list should come from a service?!
    var listOfCountries = new List<CountryClass>()
    {
        new CountryClass(){NameInfo ="Nepal", AddressInfo = "9 Street1 YourTown YourCountry"},
        new CountryClass(){NameInfo ="India", AddressInfo = "9 Street1 YourTown YourCountry"},
        new CountryClass(){NameInfo ="USA", AddressInfo = "9 Street1 YourTown YourCountry"},
        new CountryClass(){NameInfo ="Australia", AddressInfo = "9 Street1 YourTown YourCountry"},
        new CountryClass(){NameInfo ="UK", AddressInfo = "9 Street1 YourTown YourCountry"},
     };

    model.CountriesList = listOfCountries;
    model.CurrentSortOrder = "ASC";

    return View("CountrySearch", model);
}

Создайте частичное представление ("_SortedCountryData"), в котором будут показаны ваши отсортированные данные. Обратите внимание, что здесь я использовал TextBoxFor. Это необходимо для того, чтобы ваша модель была привязана к элементам управления, чтобы мы могли опубликовать список для сортировки. Конечно, вы можете составлять список каждый раз из отдельной службы, которая возвращает вам список стран в соответствии с моим комментарием в CountySearch «Получить»

@model CountrySearchViewModel

        <div class="col-md-6">
        <div class="panel panel-default">
            <div class="panel-heading">
                Details
            </div>
            <div class="panel-body">
                <table class="table table-hover">
                    <tr>
                        <th><a class="sortable-link" data-sorturl="/Test/SortCountryData?columnToSort=Name&sortOrder=@Model.CurrentSortOrder">Country Name</a></th>
                    </tr>s
                    @for (int counter = 0; counter <= Model.CountriesList.Count -1; counter++) 
                    {
                        <tr>
                            <td>
                                <h4>@Html.TextBoxFor(m=> m.CountriesList[counter].NameInfo, null, new{@class="form-control"})</h4> 
                            </td>
                        </tr>
                    }
                </table>
            </div>
        </div>
    </div>

Добавьте метод для возврата частичного представления и метод для сортировки данных.

public PartialViewResult SortCountryData(CountrySearchViewModel model, string columnToSort, string sortOrder)
        {
            ModelState.Clear();

            model.CountriesList = ReturnSortedCountries(model.CountriesList, columnToSort, sortOrder);
            model.CurrentSortOrder = sortOrder == "ASC" ? "DESC" : "ASC";

            return PartialView("_SortedCountryData", model);
        }

        public List<CountryClass> ReturnSortedCountries(List<CountryClass> countryList, string columnToSort, string order)
        {
            List<CountryClass> sortedData;

            switch (columnToSort)
            {
                case "Name":
                    sortedData = order == "ASC" ? countryList.OrderBy(s => s.NameInfo).ToList() : countryList.OrderByDescending(s => s.NameInfo).ToList();
                    break;

                case "Address":
                    sortedData = order == "ASC" ? countryList.OrderBy(s => s.AddressInfo).ToList() : countryList.OrderByDescending(s => s.AddressInfo).ToList();
                    break;

                default:
                    sortedData = countryList.OrderBy(s => s.NameInfo).ToList();
                    break;
            }

            return sortedData;
        }

Я проверил это локально, и оно работает.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...