如何处理许多可能的值来进行查询?

我正在构建一个MVC应用程序,用户可以使用大量filter来获得他想要的内容。

以下是基于控制器方法的filter概述:

// // 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... } 

我想知道如何处理所有这些filter的最佳方法,以及如何根据给定的参数获取objInfo列表。 请记住,某些值可能为null。 我到目前为止所做的就是加载“所有”objInfo,然后通过删除不需要的项目对它们进行排序,这在我看来是“不聪明”,但我是MVC App的新手,我我试图找到一个更好的方法来做到这一点。

编辑

这是生成数据的视图:

 @using System.Web.Mvc.Html @model PagedList.IPagedList @{ ViewBag.Title = "SearchIndex"; } 

Objects Management

@Html.ActionLink("Create New Obj", "Create") @using (Html.BeginForm()){

All: @Html.CheckBox("allColor", true)
Blue: @Html.CheckBox("blueColor", true) Red: @Html.CheckBox("redColor", true) Yellow: @Html.CheckBox("yellowColor", true)
Purple: @Html.CheckBox("purpleColor", true) Grey: @Html.CheckBox("greyColor", true) Black: @Html.CheckBox("blackColor", true) Music: @Html.CheckBox("musicColor", true)

Obj Number:
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)
Cost: @Html.DropDownList("objCostSymbol", "=") @Html.DropDownList("objCost", String.Empty)
Power: @Html.DropDownList("powerSymbol", "=") @Html.DropDownList("powerValue", String.Empty)
Rating: @Html.DropDownList("ratingSymbol", "=") @Html.DropDownList("ratingValue", String.Empty)
Obj Name: @Html.TextBox("objName")
Owner: @Html.TextBox("ownerName")
Type: @Html.DropDownList("objType","All")
Obj Set: @Html.DropDownList("objSet", "All")
Rarity: @Html.DropDownList("objRarity", "All")

}

@ViewData["ErrorMessage"] @foreach (var item in Model) { }
Obj Name Obj Number Obj Color Additional Cost Cost Obj Type @Html.ActionLink("Power", "SearchIndex", new {sortOrder=ViewBag.PowerSortParm}) @Html.ActionLink("Rating", "SearchIndex", new {sortOrder=ViewBag.RatingSortParm}) Rarity Obj Set Name Owner Name
@Html.DisplayFor(modelItem => item.m_ObjName) @Html.DisplayFor(modelItem => item.m_ObjNumber) @Html.DisplayFor(modelItem => item.m_ObjColor) @Html.DisplayFor(modelItem => item.m_ObjAddCost) @Html.DisplayFor(modelItem => item.m_ObjCost) @Html.DisplayFor(modelItem => item.m_ObjType) @Html.DisplayFor(modelItem => item.m_ObjPower) @Html.DisplayFor(modelItem => item.m_ObjRating) @Html.DisplayFor(modelItem => item.m_ObjRarity) @Html.DisplayFor(modelItem => item.m_ObjSet.m_ObjSetName) @Html.DisplayFor(modelItem => item.m_ObjOwner) @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 })
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(" "); @:", "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(" ") @:>> }

任何建议都会帮助我做得更好,谢谢。

你通常在JavaScript中面对这个吗? 你会创建一个option对象,比如

 var op = { cardName : "..", cardType : "" , ... } 

并将其传递给一个函数。 对吗?

C#也一样。 定义一个,比如, Conditions类,就像

 public class Conditions { public string CardName {get;set;} public string CardType {get;set;} .. } 

并将其传递给您的函数,该函数控制该类型属性的值以便相应地执行。

为什么不使用ModelBinder 。 我认为这对你的案子非常有用。 请看下面:

_我有一个Model

 public class Employee { public string Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } public Address HomeAddress { get; set; } } 

ModelBinder for Employee

 public class EmployeeBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var emp = new Employee { Id = controllerContext.HttpContext.Request.Form["Id"], FirstName = controllerContext.HttpContext.Request.Form["FirstName"], LastName = controllerContext.HttpContext.Request.Form["LastName"], BirthDate = new DateTime(int.Parse(controllerContext.HttpContext.Request.Form["year"]), int.Parse(controllerContext.HttpContext.Request.Form["month"]), int.Parse(controllerContext.HttpContext.Request.Form["day"])) }; return emp; } } 

然后Controller

 public ActionResult Example(Employee emp) { return View(emp); } 

URL: http://localhost:1034/Home/Example?Id=1&LastName=lazycatit

这是一种可以解决问题的方法。

首先,使用搜索参数创建ViewModel。

 public class FilterViewModel { public string ObjName { get; set; } public string ObjType { get; set; } public string OtherType { get; set; } } 

在您的控制器中,将其传递给视图。

 public virtual ActionResult SearchResults() { return View(new FilterViewModel()); } 

在SearchResults.cshtml中,您需要将模型编码为json,然后使用ajax调用来过滤结果。 假设有一个带有btnFilterResults id的按钮。 这将使用ajax从部分视图(应该是您的表)加载结果。

  

最后,在您的控制器中,您可以获得结果:

 [HttpGet] public virtual ActionResult LoadTableReporteGeneral(string viewModel) { var filterOptions = JsonConvert.DeserializeObject(viewModel); var query = from t in db.YourTableName select t; //This returns an IQueryable with all of your data, no filtering yet. //Start filtering. if(!String.IsNullOrEmpty(filterOptions.ObjName)) { query = query.Where(x => x.ObjName == filterOptions.ObjName); } if(!String.IsNullOrEmpty(filterOptions.ObjType )) { query = query.Where(x => x.ObjType == filterOptions.ObjType ); } //and so on. //Finally return a partial view with your table. return PartialView(MVC.Shared.Views._YourTableName, query); } 

注意:我正在使用T4MVC和Json.Net软件包。

希望这可以帮助。