如何将表单值显示为URL段?

时间:2014-06-27 18:16:28

标签: c# asp.net asp.net-mvc asp.net-mvc-4 routes

我有一个使用MVC 4的商店网站。我无法正确使用该路线。目前它只是发布搜索字符串。我希望它每次都显示搜索字符串。在网站布局中,我有一个使用此代码的搜索框:

_SiteLayout.cshtml:

@using (Html.BeginForm("Search", "Catalog"))
{
     <div class="input-group">
          @Html.TextBox("searchString", "", new Dictionary<string, object> {{"placeholder", "Enter something to search"}, {"class", "form-control input-search"}})
          <span class="input-group-btn">
               <button class="btn btn-default no-border-left" type="submit"><i class="fa fa-search"></i></button>
          </span>
      </div>
}

我的routeconfig使用了这个:

RouteConfig.cs:

routes.MapRoute(
        "Search",
        "Catalog/Search/{searchString}",
        new {controller = "Catalog", action = "Search", searchString = string.Empty});

当有人在页面上的搜索框中输入内容时,会将其重定向到/ Catalog / Search。搜索功能很有用,但我想让它显示这个网址:  / Catalog / Search / i +搜索+ for + something

任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

此行为超出了MVC的控制范围。如果您通过POST提交表单,表单值将在请求正文中提交。如果通过GET提交,则将在查询字符串上创建值。这是由浏览器控制的。

我立即可以看到一个可能的解决方案,即接受查询字符串上的值并使用查询值作为路由参数重定向到相同的操作(编辑:考虑一下,如果原始请求是POST):

@using (Html.BeginForm("Search", "Catalog", FormMethod.GET))

然后在你的行动中:

public ActionResult Search(string searchString)
{
    if(!string.IsNullOrEmpty(Request["searchString"]))
    { 
        return RedirectToAction("Search", new { searchString });
    }

    /* Do the rest of your processing here */
}

这应检查该值是否在查询字符串中,如果是,则将GET请求重新生成为相同的操作。因为MVC现在处于控制之中,所以它应该考虑您的路由并将参数放在路径而不是查询字符串中。

这当然是每次搜索的额外HTTP请求,但这应该是相当简单的。

或者,您可以使用jQuery读取表单值,构造URL并执行重定向。