![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
SearchEngine
Следующим шагом к просмотру данных будет создание поиска. Поиск будет простой, по совпадению подстроки в одном из полей данных. Входной параметр – searchString. public ActionResult Index(int page = 1, string searchString = null) { if (! string.IsNullOrWhiteSpace(searchString)) { //тут Поиск return View(data); } else { var data = new PageableData< User> (Repository.Users, page, 5); return View(data); } } Создадим класс SearchEngine, который принимает значения IQueryable< User>, и строку поиска, а возвращает данные по поиску (/Global/SearchEngine.cs): Первым делом, создадим классы по очистке строки запроса, никаких тегов и убираем разделители типа [, ], {, }, (,): /// < summary> /// The regex strip html. /// < /summary> private static readonly Regex RegexStripHtml = new Regex(" < [^> ]*> ", RegexOptions.Compiled);
private static string StripHtml(string html) { return string.IsNullOrWhiteSpace(html)? string.Empty: RegexStripHtml.Replace(html, string.Empty).Trim(); }
private static string CleanContent(string content, bool removeHtml) { if (removeHtml) { content = StripHtml(content); }
content = content.Replace(" \\", string.Empty). Replace(" |", string.Empty). Replace(" (", string.Empty). Replace(")", string.Empty). Replace(" [", string.Empty). Replace(" ]", string.Empty). Replace(" *", string.Empty). Replace("? ", string.Empty). Replace(" }", string.Empty). Replace(" {", string.Empty). Replace(" ^", string.Empty). Replace(" +", string.Empty);
var words = content.Split(new[] { ' ', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); var sb = new StringBuilder(); foreach (var word in words.Select(t => t.ToLowerInvariant().Trim()).Where(word => word.Length > 1)) { sb.AppendFormat(" {0} ", word); }
return sb.ToString(); }
Создаем поиск: public static IEnumerable< User> Search(string searchString, IQueryable< User> source) { var term = CleanContent(searchString.ToLowerInvariant().Trim(), false); var terms = term.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var regex = string.Format(CultureInfo.InvariantCulture, " ({0})", string.Join(" |", terms));
foreach (var entry in source) { var rank = 0;
if (! string.IsNullOrWhiteSpace(entry.Email)) { rank += Regex.Matches(entry.Email.ToLowerInvariant(), regex).Count; } if (rank > 0) { yield return entry; } } } В первой строке очищаем строку запроса. Создаем regex для поиска. В данном случае, мы ищем только в поле Email у пользователей.
Как это работает: · При вводе слова в поиске, например, «cher [2]», вначале убираем разделители, получаем «cher 2». · Создаем regex = (cher|2). · Просматриваем весь список, переданный через IQueryable< User> · Если есть совпадение, то выносим его в IEnumerable - yield return entry Изменяем Action (/Areas/Default/Controller/UserController.cs): public ActionResult Index(int page = 1, string searchString = null) { ViewBag.Search = searchString; if (! string.IsNullOrWhiteSpace(searchString)) { var list = SearchEngine.Search(searchString, Repository.Users).AsQueryable(); var data = new PageableData< User> (list, page, 5); return View(data); } else { var data = new PageableData< User> (Repository.Users, page, 5); return View(data); } } Добавляем форму поиска во View: @{ ViewBag.Title = " Users"; Layout = " ~/Areas/Default/Views/Shared/_Layout.cshtml"; var searchString = (string)ViewBag.Search; }
< h2> Users< /h2>
@using (Html.BeginForm(" Index", " User", FormMethod.Post, new { @class = " form-search" })) { @Html.TextBox(" searchString", searchString?? " ", new { @class = " input-medium search-query" }) < button type=" submit" class=" btn" > Поиск< /button> } Обратите внимание на ViewBag, это dynamic контейнер, им можно пользоваться для передачи второстепенных данных. Добавим в пагинатор строку поиска: @Html.PageLinks(Model.PageNo, Model.CountPage, x => Url.Action(" Index", new {page = x, searchString}))
|