0

我在 Razor 模板中有一个搜索框:

    @{
        using (Html.BeginForm("Detail", "Book", FormMethod.Get))
        {
        @Html.TextBox("Id")
        <input type="submit" value="Search" />
        }
    }

当我提交搜索时,它会转到如下网址:

~/Book/Detail?id=1234

但是我希望它像这样格式化网址,只是因为我认为它看起来更干净:

~/书/详细信息/1234

效果很好,因为控制器方法签名如下所示:

    // GET: /Book/Detail/id
    public ActionResult Detail(string id)

带有 TextBoxFor 的模型

我试过一个Html.TextBoxFor

    @model WebApplication.Models.SearchModel
    @{
        using (Html.BeginForm("Detail", "Book", FormMethod.Get))
        {
        @Html.TextBoxFor(m => m.Id)
        <input type="submit" value="Search" />
        }
    }

结果相同。

4

4 回答 4

1

我想你想看看 @Html.BeginRouteForm 方法,就像在这个问题中一样。

于 2013-08-07T09:29:14.497 回答
1

您使用GET请求。这意味着所有参数都将出现在 url 框中。我现在无法检查,但我想您可以使用以下选项:

  1. IIS url 重写 - http://www.iis.net/downloads/microsoft/url-rewrite
  2. 通过 web.config 重写 URL - http://www.hanselman.com/blog/RedirectingASPNETLegacyURLsToExtensionlessWithTheIISRewriteModule.aspx

还有一批愚蠢的方法:

  1. 您可以将您的请求更改为POST然后通过 JS 修改 URL -修改 URL 而无需重新加载页面
  2. 您可以重定向请求

另外,您是否尝试为搜索 url 添加个人路由?

于 2013-08-07T11:54:09.210 回答
0

答案是添加一个新的搜索操作,然后重定向到详细信息。这很好,因为我可以在搜索时选择做更多事情,例如如果查询有多个匹配项,则返回不同的视图。

    //
    // GET: /Book/Search?query=
    public ActionResult Search(string query)
    {
        return RedirectToAction("Detail", new { id = query });
    }

    //
    // GET: /Book/Detail/id
    public ActionResult Detail(string id)

剃刀:

@{
    using (Html.BeginForm("Search", "Book", FormMethod.Get))
    {
        @Html.TextBox("query")
        <input type="submit" value="Search" />
    }
}
于 2013-08-07T13:55:17.603 回答
0

尝试使用模型提交表单并使用@Html.TextBoxFor。

于 2013-08-07T09:32:46.283 回答