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之前!谢谢你的帮助