Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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}))






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.