amsga Ответов: 1

Как отфильтровать сеточное представление с помощью нескольких фильтров на основе entity framework и веб-форм.


Всем Привет,

Я пытаюсь выбрать ASP.NET для проекта, который я делаю.
Я строил свое решение на основе шаблона веб - форм, предоставленного VS 2017.

Мне удается сделать привязку данных с помощью gridview, используя
SelectMethod
представленный.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я пытаюсь фильтровать свои данные на основе более чем одного элемента управления.

Я видел несколько решений для фильтрации одного элемента управления:
ASP.NET 4.5: фильтрация с использованием привязки модели в ASP.NET веб-формы | DotNetCurry
ASP.NET привязка модели веб-форм | Geeky Tidbits
Но они, кажется, указывают только на один элемент управления.

Я уже построил несколько элементов управления, чтобы обеспечить дату для фильтрации дат, и еще один элемент управления для поиска в журналах.

У меня есть ощущение, что в будущем мне понадобится больше ресурсов или, возможно, руководство, поскольку я уже совершенно запутался между веб-формами, СПА и некоторыми технологиями, стоящими за ними, и тем, как они отличаются.

Что я уже пробовал:

transactionhistory в.aspx-файл
<div class="form-group">
    <asp:Label runat="server" AssociatedControlID="LikeCategoryName" CssClass="control-label">Category Name: </asp:Label>
    <asp:TextBox ID="LikeCategoryName" runat="server" CssClass="form-control" />
</div>
...
<asp:GridView runat="server" ID="TransactionHistoryGrid"

    ItemType="transactionhistory" DataKeyNames="Id"

    SelectMethod="TransactionHistoryGrid_GetData"

    AllowSorting="true" AllowPaging="true" PageSize="10"

    AutoGenerateColumns="false" CssClass="table table-striped table-bordered" HeaderStyle-CssClass="thead-dark">
    <Columns>
        <asp:DynamicField DataField="DateTime" DataFormatString="{0:s}" HtmlEncode="false" />
        <asp:DynamicField DataField="CategoryName" />
        <asp:DynamicField DataField="Log" />
        <asp:TemplateField HeaderText="Status" SortExpression="Status">
            <ItemTemplate>
                <asp:Label runat="server" Text='<%# Boolean.Parse(Eval("Status").ToString()) ? "Successful" : "Failed" %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>


transactionhistory в.aspx-файл.в CS
public IQueryable<transactionhistory> TransactionHistoryGrid_GetData([Control("LikeCategoryName")] String category)
{
    var query = entities.transactionhistories;
    if (category.length > 0)
    {
        query = query.Where(c => c.CategoryName.Contains(category));
    }
    return query;
}

1 Ответов

Рейтинг:
7

Richard Deeming

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

public IQueryable<transactionhistory> TransactionHistoryGrid_GetData(
    [Control("LikeCategoryName")] string category,
    [Control("SecondFilterControl")] string secondFilter,
    [Control("AnotherFilterHere")] int? anotherFilter)
{
    ...
}

Затем примените все фильтры, которые имеют значение для вашего запроса:
if (!string.IsNullOrEmpty(category))
{
    query = query.Where(c => c.CategoryName.Contains(category));
}
if (!string.IsNullOrEmpty(secondFilter))
{
    query = query.Where(c => c.SomeOtherField.StartsWith(secondFilter));
}
if (anotherFilter != null)
{
    DateTime minimumDate = DateTime.Today.AddDays(-anotherFilter.GetValueOrDefault());
    query = query.Where(c => c.SomeDateField >= minimumDate);
}

Привязка моделей и веб-формы в Visual Studio 2013 | Microsoft Docs[^]


amsga

Спасибо, Ричард, это действует как заклинание. Теперь мне просто нужно выяснить, как вызвать обратную связь с помощью кнопки.