项目作者: artem-sedykh

项目描述 :
Filtering data in ASP.NET MVC
高级语言: C#
项目地址: git://github.com/artem-sedykh/Sprint.Filter.git
创建时间: 2013-05-30T10:42:01Z
项目社区:https://github.com/artem-sedykh/Sprint.Filter

开源协议:MIT License

下载


Sprint.Filter NuGet Downloads

Status

Build status

What is this?

Sprint.Filter is a library that allows you to easily filter the IEnumerable/IQueryable. Sprint.Filter allow you to create both simple filter with one condition, and filter with multiple conditions, so there is the ability to filter using internal class collection.

How do I use it?

  1. Install “Sprint.Filter” via NuGet.
  2. Create your collection of filters and call ApplyFilters filtering.

Example

/Filters/UserFilter.cs

  1. public class UserFilter : FilterCollection
  2. {
  3. public UserFilter(string gridKey, IDirectionActivityService directionActivityService, IMvcPrincipal user)
  4. {
  5. Add("DirectionActivity",new ValueTypeFilter<DirectionActivity, int>()).For(c => c.Id)
  6. .Conditions(conditions => conditions["isin"] = new ValueTypeIsInCondition<int>())
  7. .SetTitle("Direction:")
  8. .SetTemplate("IsInFastFilter")
  9. .SetDictionary(() => directionActivityService.GetTreeSource(user))
  10. .ConditionBuilder((expression, conditionKey) =>
  11. expression != null
  12. ?Linq.Expr<User, bool>(u => u.DirectionActivities.AsQueryable().Any(expression))
  13. : null);
  14. Action = "Grid";
  15. UpdateTargetId = gridKey;
  16. }
  17. }

/Controllers/DealerController.cs

  1. //ActionGridOptions implements IFilterOptions interface, you can use FilterOptions class.
  2. public ActionResult Grid(ActionGridOptions options, IMvcPrincipal user)
  3. {
  4. ViewBag.SearchString = options.SearchString;
  5. var filter = new UserFilter(DealerGridKey, _directionActivityService,user);
  6. var query = filter.Init(options).ApplyFilters(_dealerService.GetAll(user))
  7. .Where(UserSpecification.Search(options.SearchString).Predicate);
  8. var model = new DealerGridModel(DealerGridKey);
  9. return View(new ActionGridView<User>(model, query).Init(options));
  10. }
  11. public ActionResult Filter(ActionGridOptions options, IMvcPrincipal user)
  12. {
  13. var filter = new UserFilter(DealerGridKey, _directionActivityService, user);
  14. filter.Init(options);
  15. return View("FastFilterCollection", filter);
  16. }

/Views/Shared/FastFilterCollection.cshtml

  1. @model IFilterCollectionView
  2. @{
  3. Layout = null;
  4. var options = (Model.FilterOptions as ActionGridOptions);
  5. var searchString = options != null ? options.SearchString : null;
  6. }
  7. <div class="fast-filter-wrap">
  8. <input type="text" class="search" placeholder="Ïîèñê" data-update-grid="@Model.UpdateTargetId" value="@searchString" />
  9. <div class="filter-panel">
  10. <table>
  11. <tr>
  12. <td>
  13. <span class="filter-panel-title">My Filters</span>
  14. </td>
  15. <td>
  16. <a class="filter-background filter-background-white" data-grid-setting="@Model.UpdateTargetId" href="@Url.Action("GridSetting",new{gridKey=Model.UpdateTargetId})">
  17. <i class="filter-icon f-column"></i>
  18. </a>
  19. </td>
  20. <td>
  21. <a class="filter-background filter-background-white" data-grid-save="@Model.UpdateTargetId" href="@Url.Action("CreateGridState","GridState",new{gridKey=Model.UpdateTargetId})">
  22. <i class="filter-icon f-save"></i>
  23. </a>
  24. </td>
  25. <td>
  26. <a class="filter-background filter-background-white" href="@Url.Action("Excel")">
  27. <i class="filter-icon f-excel"></i>
  28. </a>
  29. </td>
  30. </tr>
  31. </table>
  32. </div>
  33. @Html.Action("SavedFilterList", "GridState", new { gridKey=Model.UpdateTargetId,stateId=Model.FilterOptions.LoadFilterId })
  34. <!--Create html form for post filter data, you can use jquery ajax form plugin (http://malsup.com/jquery/form/) -->
  35. @using (Html.BeginForm(Model.Action, Model.Controller, Model.RouteValues, FormMethod.Post, new { @class = "ajax-filter fast-filter-collection", data_update_grid = @Model.UpdateTargetId }))
  36. {
  37. <dl>
  38. @foreach (var key in Model.Filters.Keys)
  39. {
  40. var template = Model.Filters[key].TemplateName;
  41. <!--Render filter template -->
  42. @Html.EditorFor(f=>Model.Filters[key],template)
  43. }
  44. </dl>
  45. <div class="clear"></div>
  46. <div class="filter-collection-bottom">
  47. <button type="submit" class="highlight-btn"><span>Apply</span></button>
  48. <p class="standard-btn">
  49. @Html.ActionLink("Clear","ClearFilter")
  50. </p>
  51. </div>
  52. }
  53. </div>

/Views/Products/Shared/EditorTemplates/IsInFastFilter.cshtml

  1. @model IFilterView
  2. @{
  3. Layout = null;
  4. var source = Model.Dictionary as IEnumerable<ActionSelectListItem>;
  5. <!--Selected values -->
  6. ViewData["Values"] = Model.Values;
  7. }
  8. <dt>
  9. <label>@Model.Title</label>
  10. </dt>
  11. <dd>
  12. <!--Custom listbox, you can use @Html.ListBoxFor(x=>x.Values,Model.Dictionary,new{@class="ui-multi-select",style="width:118px;"})-->
  13. @Html.ActionListBoxFor(x=>x.Values,source,new{@class="ui-multi-select",style="width:118px;"})
  14. </dd>
  15. @Html.HiddenFor(m=>m.ConditionKey)
  16. @Html.HiddenFor(m=>m.TypeName)

Examples