Como lidar com muitos valores possíveis para fazer uma consulta?
Estou construindo um aplicativo MVC no qual o usuário terá a possibilidade de usar muitos filtros para obter exatamente o que deseja.
Aqui está uma visão geral desses filtros com base no método do controlador:
//
// GET: /Card/SearchIndex
public ActionResult SearchIndex(string objName, string objType, string objCostSymbol, string objCost, string powerSymbol,
string powerValue, string ratingSymbol, string ratingValue, string ownerName, string objSet,
string objRarity, string addCostValue, int? objNumber,
string addCostValue2, string addCostValue3, string addCostValue4, string addCostValue5, string addCostValue6,
bool? blueColor, bool? redColor, bool? yellowColor, bool? purpleColor, bool? greyColor, bool? blackColor,
bool? musicColor, bool? allColor)
{
// MORE CODE HERE...
}
Eu quero saber como seria a melhor maneira de lidar com todos esses filtros, e como eu poderia obter uma lista de objInfo com base nos parâmetros fornecidos. Tenha em mente que alguns valores podem ser nulos. Tudo o que fiz até agora é carregar "all" o objInfo que eu consegui, depois classificá-los removendo o item não desejado, que é no meu sentido "não inteligente", mas eu sou novo no MVC App e no I ' Estou tentando encontrar uma maneira melhor de fazer isso.
EDITAR
Aqui está a visão que gera os dados:
@using System.Web.Mvc.Html
@model PagedList.IPagedList<MvcApp.Models.ObjInfo>
@{
ViewBag.Title = "SearchIndex";
}
<h2>Objects Management</h2>
<p>
@Html.ActionLink("Create New Obj", "Create")
@using (Html.BeginForm()){
<p>
<label>
Obj Colors : Check a box to search for a color.
</label>
All: @Html.CheckBox("allColor", true)<br/>
Blue: @Html.CheckBox("blueColor", true)
Red: @Html.CheckBox("redColor", true)
Yellow: @Html.CheckBox("yellowColor", true) <br/>
Purple: @Html.CheckBox("purpleColor", true)
Grey: @Html.CheckBox("greyColor", true)
Black: @Html.CheckBox("blackColor", true)
Music: @Html.CheckBox("musicColor", true)
</p>
<p>
<label>
Obj Values: Select a value in the list below.
</label>
Obj Number: <input type="number" min="0" max="9999" name="cardNumber" value="int" style="width: 70px"/><br/>
Additional Cost (contains): @Html.DropDownList("addCost", String.Empty) + @Html.DropDownList("addCost2", String.Empty)
+ @Html.DropDownList("addCost3", String.Empty) + @Html.DropDownList("addCost4", String.Empty)
+ @Html.DropDownList("addCost5", String.Empty) + @Html.DropDownList("addCost6", String.Empty) <br/>
Cost: @Html.DropDownList("objCostSymbol", "=") @Html.DropDownList("objCost", String.Empty)<br />
Power: @Html.DropDownList("powerSymbol", "=") @Html.DropDownList("powerValue", String.Empty)<br/>
Rating: @Html.DropDownList("ratingSymbol", "=") @Html.DropDownList("ratingValue", String.Empty)<br />
<label>
Obj Text: Write a name, part of a name, or a word.
</label>
Obj Name: @Html.TextBox("objName") <br/>
Owner: @Html.TextBox("ownerName") <br />
<label>
Obj Categories: Select a category in the list below.
</label>
Type: @Html.DropDownList("objType","All") <br/>
Obj Set: @Html.DropDownList("objSet", "All") <br/>
Rarity: @Html.DropDownList("objRarity", "All")<br />
<div class="float-right">
<input type="submit" value="Filter" name="submitbutton">
</div>
</p>
}
</p>
<span style="color:red; font-size: 1.7em; font-style: italic;">@ViewData["ErrorMessage"]</span>
<table>
<tr>
<th>Obj Name</th>
<th>Obj Number</th>
<th>Obj Color</th>
<th>Additional Cost</th>
<th>Cost</th>
<th>Obj Type</th>
<th>@Html.ActionLink("Power", "SearchIndex", new {sortOrder=ViewBag.PowerSortParm})</th>
<th>@Html.ActionLink("Rating", "SearchIndex", new {sortOrder=ViewBag.RatingSortParm})</th>
<th>Rarity</th>
<th>Obj Set Name</th>
<th>Owner Name</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.m_ObjName)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjColor)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjAddCost)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjCost)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjType)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjPower)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjRating)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjRarity)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjSet.m_ObjSetName)
</td>
<td>
@Html.DisplayFor(modelItem => item.m_ObjOwner)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.m_ObjID }) |
@Html.ActionLink("Details", "Details", new { id=item.m_ObjID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.m_ObjID })
</td>
</tr>
}
</table>
<div>
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
of @Model.PageCount
@if (Model.HasPreviousPage)
{
@Html.ActionLink("<<", "SearchIndex", new {page = 1, sortOrder = ViewBag.CurrentSort})
@Html.Raw(" ")
@Html.ActionLink("< Prev", "SearchIndex", new {page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort})
}
else
{
@:<<
@Html.Raw(" ");
@:< Prev
}
@if (Model.HasNextPage)
{
@Html.ActionLink("Next >", "SearchIndex", new {page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort})
@Html.Raw(" ")
@Html.ActionLink(">>", "SearchIndex", new {page = Model.PageCount, sortOrder = ViewBag.CurrentSort})
}
else
{
@:Next >
@Html.Raw(" ")
@:>>
}
</div>
Qualquer conselho me ajudará a fazer um trabalho melhor, obrigado.