Использование флажков для фильтрации таблицы по логическим столбцам в MVC 5 - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу иметь возможность фильтровать содержимое моей таблицы «Контакты» по интересам, и в настоящее время я пытаюсь достичь этого с помощью ряда логических свойств, представляющих каждый отдельный интерес.План состоял в том, чтобы я собирался установить на странице «Индекс» ряд флажков для каждого интереса, которые позволили бы пользователю отображать только те контакты, у которых для одной или нескольких соответствующих переменных интересов установлено значение «истина» для каждого флажка, который был отмечен(или все контакты, если флажки не установлены).Насколько я могу сказать, это теоретически возможно, но мои исследования до сих пор не дали никаких результатов относительно того, как выполнить этот вид фильтрации именно таким образом.Может ли кто-нибудь здесь, возможно, указать мне правильное направление?

РЕДАКТИРОВАТЬ: Вот какой код я до сих пор связан с проблемой:

РЕДАКТИРОВАТЬ2: У меня есть номинально работающий набор флажков на месте, но теперь фильтрация работает не так, как я хочу.Я хочу, чтобы контроллер отправлял представление только в том случае, если в одной или нескольких контактах для одной или нескольких переменных установлено значение «true» или «Все контакты», если флажки не установлены.То, что у меня сейчас работает, отлично работает для одиночных выборов, но с несколькими выборами возвращает только те записи, которые соответствуют всем флажкам.Я хотел бы знать, как условно фильтровать более эффективно и действенно, чем то, что у меня есть сейчас.

Вот моя модель - строка «Интересы» была просто для того, чтобы сделать ее более представительной в индексе, чем просто строкасерые флажки:

public class Contact : IValidatableObject
{
    public int Id { get; set; }

    public string Email { get; set; }

    public string PhoneNum { get; set; }

    public string Name { get; set; }

    public bool LikesClassic { get; set; }

    public bool LikesCountry { get; set; }

    public bool LikesHipHop { get; set; }

    public bool LikesMetal { get; set; }

    public bool LikesPop { get; set; }

    public bool LikesRap { get; set; }

    public bool LikesRock { get; set; }

    public string Interests
    {
        get
        {
            var interests = "";

            if (this.LikesClassic)
                interests = interests + "[Classic] ";
            if (this.LikesCountry)
                interests = interests + "[Country] ";
            if (this.LikesHipHop)
                interests = interests + "[Hip-Hop] ";
            if (this.LikesMetal)
                interests = interests + "[Metal] ";
            if (this.LikesPop)
                interests = interests + "[Pop] ";
            if (this.LikesRap)
                interests = interests + "[Rap] ";
            if (this.LikesClassic)
                interests = interests + "[Rock] ";

            return interests;
        }
    }

Вот мой вид - флажки установлены, но еще не работают

@model IEnumerable<ContactInterests.Models.Contact>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>

@using (Html.BeginForm())
{
<p>
    Classic: @Html.CheckBox("Classic")
    Country: @Html.CheckBox("Country")
    Hip-Hop: @Html.CheckBox("HipHop")
    Metal: @Html.CheckBox("Metal")
    Pop: @Html.CheckBox("Pop")
    Rap: @Html.CheckBox("Rap")
    Rock: @Html.CheckBox("Rock")
    <input type="submit" value="Search" />
</p>
}

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Email)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.PhoneNum)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            Interests
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Email)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PhoneNum)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Interests)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }

</table>

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

public ActionResult Index(string Classic, string Country, string HipHop, 
string Metal, string Pop, string Rap, string Rock)
    {
        var contactList = from c in db.Contacts select c;

        if (Classic == "true")
        {
            contactList = contactList.Where(c => c.LikesClassic == true);
        }
        if (Country == "true")
        {
            contactList = contactList.Where(c => c.LikesCountry == true);
        }
        if (HipHop == "true")
        {
            contactList = contactList.Where(c => c.LikesHipHop == true);
        }
        if (Metal == "true")
        {
            contactList = contactList.Where(c => c.LikesMetal == true);
        }
        if (Pop == "true")
        {
            contactList = contactList.Where(c => c.LikesPop == true);
        }
        if (Rap == "true")
        {
            contactList = contactList.Where(c => c.LikesRap == true);
        }
        if (Rock == "true")
        {
            contactList = contactList.Where(c => c.LikesRock == true);
        }
        if (Classic == "false" && Country == "false" && HipHop == "false" && Metal == "false" && Pop == "false" && Rap == "false" && Rock == "false")
        {
            contactList = from c in db.Contacts select c;
        }


        return View(contactList.ToList());
    }
...