我正在为Asp Mvc添加一个搜索框。
这是表单的html:
@using (Html.BeginForm("Query", "Search", FormMethod.Get))
{
<input type="text" name="q" />
<input type="submit" value="Seach" />
}
我添加了这条路线
routes.MapRoute("Search", "q={query}",
new { controller = "Search", action = "Query" });
我希望该表单生成一个类似于http://localhost:####/q=value in textbox
的网址。
是否有可能改变MVC生成网址的方式?这是我现在得到的:
http://localhost:50916/Search/Query?q=value in textbox
答案 0 :(得分:1)
根据RFC 3986,=
符号是用于分隔参数和参数值的保留字符,您不应在URI的这一部分使用它。您最接近的是http://localhost:####/?q=value
。
事实上,您可以使用这样的路由作为传入的URL,ASP.NET MVC将正确解析它并调度到正确的控制器操作。问题出在<form>
标记上。有两种可能的动词:GET和POST。如果您使用在表单中输入的POST参数将在请求正文中发送而不会显示在URL中。如果您根据规范使用GET,则用户代理将通过在追加?
后将输入字段的键/值对附加到表单的操作来发送请求。
因此,除非您使用一些可处理表单onsubmit
事件的javascript,取消默认提交并将window.location
更改为所需格式,否则无法达到预期效果。问题是:你真的需要走那么远吗?
答案 1 :(得分:1)
如果您需要对目标网址进行更具体的控制,则可以使用标准HTML表单标记而不是HTML帮助程序。