C# 不带查询字符串的路由
我在默认路由之前添加了以下路由C# 不带查询字符串的路由,c#,asp.net-mvc,routing,C#,Asp.net Mvc,Routing,我在默认路由之前添加了以下路由 routes.MapRoute( name: "RecordDefault", url: "{controller}/{action}/{name}", defaults: new { controller = "Person", action = "Record" } ); 我可以使用:sitename/Person/Record/John点击我想要的页面 但是我在导航中使用以下代码进行了全局搜索 @using (Html.BeginForm
routes.MapRoute(
name: "RecordDefault",
url: "{controller}/{action}/{name}",
defaults: new { controller = "Person", action = "Record" }
);
我可以使用:sitename/Person/Record/John点击我想要的页面
但是我在导航中使用以下代码进行了全局搜索
@using (Html.BeginForm("Record", "Person", FormMethod.Get, new { @class = "navbar-form navbar-left" }))
{
@Html.TextBox("name", "", new { @class = "form-control", placeholder = "Search Name" })
}
当我提交表单时,会显示以下URL:sitename/Person/Record?name=John
我必须做什么才能确保URL的格式没有查询字符串参数
谢谢
与张贴的副本不同,标记的答案不能解决我的问题,根据评论,它对其他人也不起作用。使用表单post
FormMethod.post
而不是Get。因此,该值不会出现在querystring中
@using (Html.BeginForm("Record", "Person", FormMethod.Post, new { @class = "navbar-form navbar-left" }))
{
@Html.TextBox("name", "", new { @class = "form-control", placeholder = "Search Name" })
}
在控制器中添加以下内容-
[HttpPost]
public ActionResult Record(string name)
{
//code for what needs to be performed.
return View();
}
在您的视图中,添加以下代码替换现有代码并检查-
@using (Html.BeginForm("Record", "Person", FormMethod.Post))
{
@Html.TextBox("name")
<input type="submit" />
}
@使用(Html.BeginForm(“Record”、“Person”、FormMethod.Post))
{
@Html.TextBox(“名称”)
}
您的表单生成。/Person/Record?name=John
,因为浏览器不知道您的路线(这是服务器上运行的c代码)。HTML标准要求在获取方法时将成功表单控件的值添加为查询字符串值
为了生成您的首选url(。/Person/Record/John
),您需要javascript截取并取消默认提交,并构建一个要导航到的url。使用jQuery:
$('form').submit(function() {
var baseUrl = $(this).attr('action');
// or var baseUrl = '@Url.Action("Record", "Person")';
var url = baseUrl + '/' + $('#name').val();
location.href = url; // redirect
return false; // cancel the default submit
});
我先有这个,但它不再包括搜索的名字了。我希望它读作sitename/Person/Record/John。我想,如果有添加路由的话,它的格式就会像id一样符合我的要求parameters@BadDub使用包含John for ex:sitename/Person/Record/{name}的属性路由,或者在routeconfig默认值中尝试此选项:new{controller=“Person”,action=“Record”,name=UrlParameter.Optional}//name参数与mehod参数相同这似乎仍然生成带有?name=query string的URL可能与此中标记的答案重复仍然在URL中保留查询字符串,这实际上是OP已经拥有的(并且不会生成作为路由参数的textbox值-只是一个查询字符串参数)!感谢您的回复,这确实以正确的方式格式化了URL,但是当我推断控制器时,名称值为null,即使它在URL中是正确的。非常奇怪的行为。事实上,很抱歉,这很有效。我一直在摆弄路由,并将默认路由放在名称参数one之前!谢谢你的帮助