如何在ASP.NET MVC应用程序中实现搜索框?

时间:2011-08-12 00:48:17

标签: c# asp.net-mvc-3 search

我需要在我正在编写的C#MVC应用程序上实现一个“搜索”框。

我以前从来没有实施过“搜索”框,而且我一直在寻找一些最佳实践,而且我找不到我想要的东西。

我非常喜欢搜索在stackoverflow上的工作方式。

如果我输入几个随机字词,它会导航到网址http://stackoverflow/search?q=few+random+words

如果我输入标题:随机,则导航​​到网址https://stackoverflow.com/search?q=title%3Arandom

客户端(当我按下回车键时)和服务器上发生了什么以进行搜索?

我故意遗漏了我已经对正在发生的事情的任何想法,因为我不想偏袒答案(或表现出我的无知)。

编辑:我正在为这个问题添加一些细节。

  1. 搜索词在哪里以及如何转换为查询字符串参数?即少数随机单词转换为少数+随机+单词,标题:随机转换为标题%3Arandom

  2. 在查询中使用的变量中,少数+随机+单词的位置和方式是什么?

  3. 查询只是一个大的Where子句,它会为每个位于+符号之间的项目追加“和”吗?

  4. 我猜你可以通过字符串解析并做一些替换来实现1和2但是看起来确实已经有了可以自动转换(和恢复)搜索字符串的东西。我正在尝试为用户在搜索框中键入ANYTHING做好准备。

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

这些网址使用所谓的查询字符串。这是一个" GET"请求允许客户端脚本(javascript)以及后端代码检索用户"查询"。只要您看到'?'它是查询字符串的开头。这允许有人像:

http://google.com?q=Stuff%20to%20Search%20here 可以通过& anothercommand = somethingelse

添加多个参数

因此允许程序或脚本在google上调用搜索,而无需在框中输入任何内容。

您可以使用C#" Request.QueryString ["参数"]"来访问查询字符串。在这种情况下,这些堆栈溢出URL的参数将是" q"。

之后,查询数据库并返回结果。由于我不确定您的编码有多好,我不确定您是否尝试过要求网站或C#SQL端。如果我错了,请道歉。

在客户端: 我想象它在客户端上发生的方式是,提交表单时文本框上的脚本重定向到您提到的URL,并将这些查询参数添加到url字符串中。不要忘记url编码。这是内置于JavaScript。即空间' '成为'%20'

当表单提交时,服务器代码会检查表格中是否有任何查询字符串参数" q"。如果有,并且它不为null,它将查询数据库,以几种方式之一返回,最有可能通过服务器控件。

1)这就是URL编码。它是URL中不支持的字符列表。因此他们需要改变。空间有一个标准集,例如%20。在javascript中,您将使用所需的查询字符串重定向到结果页面。在重定向之前,使用信息here对其进行编码。即改变' '进入+或%20(它应该是%20,我发现+通常是Internet Explorer的方式。 )

2)查询字符串的作用类似于密钥对值的哈希表。使用Request.QueryString,您可以选择密钥" q"并收到字符串"几个随机单词"。然后,这将被替换为您的SQL查询。这是在C#侧完成的,首先检查参数q是否存在。

3)您可以通过许多不同的方式进行查询。但是,搜索"和"等会给你很多不同的结果。您可以做的是解析常用单词列表,然后根据每个单词的结果数量对结果进行排名。即在最简单的搜索中,对于LARGE数据库来说,这是不明智的,并且......在类似于'%word%或'%word2%'要获得每个单词,请执行string.split。

答案 2 :(得分:2)

尽管我讨厌这样做,但我必须回答我自己的问题。我无法理解的是搜索词如何看似自动转换为查询字符串编码参数(即所有空格用+号替换而不是用%20替换)。我不明白这是如何实现的,我喜欢它所以我想要相同的能力。

最后,我应该做的是从SO复制html并在我自己的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 = few + random + words”任何其他编码。

现在最好的部分是,在控制器代码中,“q”参数自动可用作“几个随机字”而不需要任何其他编码。

示例:

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

    return View(model);
} 

我唯一没有测试过它如何处理脚本攻击,但我想我也会免费获得它。 :)

希望这可以帮助任何偶然发现这个答案的人。感谢所有提交答案的人。如果我的问题不够明确,我很抱歉。