Как реализовать окно поиска в приложении ASP.NET MVC? - PullRequest
4 голосов
/ 12 августа 2011

Мне нужно реализовать поле «Поиск» в приложении C # MVC, которое я пишу.

Раньше мне никогда не приходилось внедрять поле «Поиск», я искал некоторые лучшие практики и не совсем нашел то, что искал.

Мне очень нравится, как поиск работает в стеке.

Если я наберу несколько случайных слов, он перейдет к URL http://stackoverflow/search?q=few+random+words.

Если я напишу в заголовке: random, он перейдет на URL https://stackoverflow.com/search?q=title%3Arandom

Что происходит как на клиенте (когда я нажимаю клавишу ввода), так и на сервере, чтобы выполнить поиск?

Я нарочно отбросил любые мысли о том, что происходит, потому что я не хочу искажать ответы (или демонстрировать свое невежество).

РЕДАКТИРОВАТЬ : Я добавляю некоторые детали к этому вопросу.

  1. Где и как поисковые термины преобразуются в параметры строки запроса? т.е. несколько случайных слов, преобразованных в несколько + случайных + слов, название: случайное слово, преобразованное в заголовок% 3Arandom

  2. Где и как несколько + случайных + слов, преобразованных в переменные, используемые в запросе?

  3. Является ли запрос только одним большим предложением Where, которое продолжает добавляться "и" для каждого элемента, который попадает между знаками +?

Полагаю, вы могли бы проанализировать строки и сделать некоторые замены, чтобы получить 1 и 2, но похоже, что уже есть что-то, что автоматически преобразует (и возвращает) строки поиска. Я пытаюсь быть готовым к тому, что мой пользователь печатает НИЧЕГО в поле поиска.

Ответы [ 3 ]

3 голосов
/ 12 августа 2011

Эти URL используют так называемую строку запроса. Это запрос «GET», который позволяет клиентскому сценарию (javascript), а также внутреннему коду получить пользовательский «запрос». В URL всякий раз, когда вы видите «?» это начало строки запроса. Это позволяет кому-то быть похожим на:

http://google.com? Д = Материал% 20to% 20Search% 20here Несколько параметров могут быть добавлены через & anothercommand =thingelse

Таким образом, позволяя программе или скрипту вызывать поиск в Google без необходимости вводить что-либо в поле.

Вы можете получить доступ к строке запроса, используя C # "Request.QueryString [" параметр "]", где в этом случае параметром для этих URL переполнения стека будет "q".

После этого вы запрашиваете базу данных и возвращаете результаты. Поскольку я не уверен, насколько вы хороши в кодировании, я не уверен, пытаетесь ли вы запросить веб-сайт или сторону C # SQL. Если я ошибаюсь, извиняюсь.

На клиенте: Я предполагаю, что это происходит на клиенте, когда скрипт в текстовом поле при отправке формы перенаправляет на указанный вами URL-адрес и добавляет эти параметры запроса в строку URL-адреса. Не забудьте URL кодировать. Это встроено в JavaScript. то есть пробел '' становится '% 20'

Когда форма отправляется, серверный код проверяет, есть ли какие-либо параметры строки запроса формы "q". Если они есть, и они не равны NULL, они будут запрашивать базу данных, возвращая ее одним из нескольких способов, скорее всего, через серверный элемент управления.

1) Вот что такое кодировка URL. Это список символов, которые не поддерживаются в URL. Таким образом, они должны быть изменены. Существует стандартный набор, например% 20, для пробела. В javascript вы будете перенаправлять на страницу результатов с нужной вам строкой запроса. перед перенаправлением используйте информацию здесь для ее кодирования. то есть измените '' на + или% 20 (на самом деле это должен быть% 20, я считаю, что + это обычно способ использования Internet Explorer. )

2) Строка запроса работает как хэш-таблица значений пар ключей. Используя Request.QueryString, вы можете выбрать ключ «q» и получить строку «Несколько случайных слов». Это затем будет подставлено в ваш запрос SQL. Это делается на стороне C # в качестве самой первой проверки, чтобы увидеть, существует ли параметр q.

3) Вы можете сделать свой запрос разными способами. Тем не менее, поиск «и» и т.д. даст вам много разных результатов. Что вы можете сделать, это проанализировать список общих слов, а затем ранжировать результаты на основе количества результатов каждого слова. т. е. в самом простом из поисков, который не рекомендуется использовать для БОЛЬШИХ баз данных "..... Где, например,"% word% или "% word2%" и т. д. Чтобы получить каждое слово, выполните строку.

3 голосов
/ 12 августа 2011
2 голосов
/ 28 августа 2011

Как бы мне не хотелось это делать, я должен ответить на свой вопрос.Что я не мог понять, так это то, как поисковые слова, по-видимому, автоматически преобразуются в закодированные в строку запроса параметры (т. Е. Все пробелы, которые заменяются знаком + вместо замены на% 20).Я не понимал, как это было достигнуто, и мне это нравится, поэтому я хотел получить те же самые способности.

В конце концов, я должен был скопировать html из SO и опробовать его на своем MVC.сайт, потому что получается, что кодировка встроена / автоматическая.Мне не нужно было ничего делать, чтобы получить функциональность.

Вот основной HTML-код для поля поиска:

<form id="frmsearch" action="~/Catalog/Search" method="get">
     <input id="q" name="q" value="@q" style="width:275px;"/>
     <input id="submit" name="submit" type="submit" style="font-weight:bold;" value="Search" />
</form>

Теперь, если вы введете «несколько случайных слов» втекстовое поле с именем «q» и нажмите кнопку «Отправить», действие формы автоматически приведет вас к «~ / Catalog / Search? q = несколько + случайные + слова» без какой-либо дополнительной кодировки.

Теперь для лучшей частив коде контроллера параметр «q» также автоматически доступен как «несколько случайных слов» без какого-либо дополнительного кодирования.

Пример:

public ActionResult Search(string q)
{
    //q = "few random words" (no need to remove '+' signs) 
    var model = GetSearchResults(q)

    return View(model);
} 

Единственное, что у меня есть 'Я проверил, как он будет обрабатывать скриптовые атаки, но я думаю, что получу это бесплатно.:)

Надеюсь, это поможет любому, кто наткнется на этот ответ.Спасибо всем, кто отправил ответы, пытаясь помочь.Извините, если мой вопрос не был достаточно ясен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...