Asp.Net MVC3, добавляющий функцию поиска - PullRequest
0 голосов
/ 13 июля 2011

Я пытаюсь реализовать функцию поиска по списку клиентов, функциональность которой подробно описана в этом руководстве на сайте Asp.Net,

http://www.asp.net/entity-framework/tutorials/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

В моем контроллере у меня есть следующее

public ViewResult Index(string sortOrder, string searchString)
    {
        ViewBag.CustomerNameSortParm = String.IsNullOrEmpty(sortOrder) ? "CustomerName desc" : "";
        ViewBag.PrimaryContactNameSortParm = sortOrder == "PrimaryContactName" ? "PrimaryContactName desc" : "PrimaryContactName";
        var cust = repository.Customers;

        if (!String.IsNullOrEmpty(searchString))
        {
            cust = cust.Where(c => c.CustomerName.ToUpper().Contains(searchString.ToUpper())
                                   || c.PrimaryContactName.ToUpper().Contains(searchString.ToUpper()));
        }

        switch (sortOrder)
        {
            case "CustomerName desc":
                cust = repository.Customers.OrderByDescending(s => s.CustomerName);
                break;
            case "PrimaryContactName":
                cust = repository.Customers.OrderBy(s => s.PrimaryContactName);
                break;
            case "PrimaryContactName desc":
                cust = repository.Customers.OrderByDescending(s => s.PrimaryContactName);
                break;
            default:
                cust = repository.Customers.OrderBy(s => s.CustomerName);
                break;
        }

        return View(cust.ToList());
    }

Оператор if проверяет значение и должен использовать оператор LINQ, WHERE для фильтрации списка,

У меня есть текстовое поле настройки, как

@using (Html.BeginForm())
{
<p>
    Find by name: @Html.TextBox("SearchString") &nbsp;
    <input type="submit" value="Search" /></p>
}

Однако, когда я ввожу имя клиента, результаты не фильтруются, я использую SQL Server 2008 R2, кто-нибудь еще сталкивался с этой проблемой? Есть ли что-нибудь еще, что нужно для работы метода Contains?

А совет ценится?

Ли

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

В переключателе порядка сортировки вы переустанавливаете переменную cust в хранилище. Клиенты.Вместо этого вы должны использовать переменную cust, чтобы применить сортировку к отфильтрованному набору.

switch (sortOrder)
        {
            case "CustomerName desc":
                cust = cust.OrderByDescending(s => s.CustomerName);
                break;
0 голосов
/ 13 июля 2011

когда вы выполняете поиск, у вас есть оператор if, но он все еще идет в оператор switch после, попробуйте

    if (!String.IsNullOrEmpty(searchString))
    {
        cust = cust.Where(c => c.CustomerName.ToUpper().Contains(searchString.ToUpper())
                               || c.PrimaryContactName.ToUpper().Contains(searchString.ToUpper()));
    }
    else
    {
        switch (sortOrder)
        {
            case "CustomerName desc":
                cust = repository.Customers.OrderByDescending(s => s.CustomerName);
                break;
            case "PrimaryContactName":
                cust = repository.Customers.OrderBy(s => s.PrimaryContactName);
                break;
            case "PrimaryContactName desc":
                cust = repository.Customers.OrderByDescending(s => s.PrimaryContactName);
                break;
            default:
                cust = repository.Customers.OrderBy(s => s.CustomerName);
                break;
        }
    }

таким образом, cust не переназначается после набора

Редактировать: Так как вы устанавливаете cust в начале вашего метода, вы также можете иметь

    if (!String.IsNullOrEmpty(searchString))
    {
        cust = cust.Where(c => c.CustomerName.ToUpper().Contains(searchString.ToUpper())
                               || c.PrimaryContactName.ToUpper().Contains(searchString.ToUpper()));
    }

    switch (sortOrder)
    {
        case "CustomerName desc":
            cust = cust.OrderByDescending(s => s.CustomerName);
            break;
        case "PrimaryContactName":
            cust = cust.OrderBy(s => s.PrimaryContactName);
            break;
        case "PrimaryContactName desc":
            cust = cust.OrderByDescending(s => s.PrimaryContactName);
            break;
        default:
            cust = cust.OrderBy(s => s.CustomerName);
            break;
    }

чтобы заказать заказ без перезагрузки

...