Я хочу иметь возможность фильтровать содержимое моей таблицы «Контакты» по интересам, и в настоящее время я пытаюсь достичь этого с помощью ряда логических свойств, представляющих каждый отдельный интерес.План состоял в том, чтобы я собирался установить на странице «Индекс» ряд флажков для каждого интереса, которые позволили бы пользователю отображать только те контакты, у которых для одной или нескольких соответствующих переменных интересов установлено значение «истина» для каждого флажка, который был отмечен(или все контакты, если флажки не установлены).Насколько я могу сказать, это теоретически возможно, но мои исследования до сих пор не дали никаких результатов относительно того, как выполнить этот вид фильтрации именно таким образом.Может ли кто-нибудь здесь, возможно, указать мне правильное направление?
РЕДАКТИРОВАТЬ: Вот какой код я до сих пор связан с проблемой:
РЕДАКТИРОВАТЬ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());
}