【问题标题】:How to change the way the Url is formatted on a submit如何更改提交时 URL 的格式
【发布时间】:2013-08-07 09:12:26
【问题描述】:

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

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

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

~/Book/Detail?Id=1234

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

~/Book/Detail/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" />
        }
    }

同样的结果。

【问题讨论】:

  • 你能告诉我,生成这个 url 的目的是什么?您是要传递这些值还是要转到那条路线?
  • @PandiyanCool 两个 url 的工作方式相同,并调用控制器操作 Detail。我只是更喜欢第二个的外观。
  • 哦,好吧:)你想实现更清洁的吗?

标签: c# razor asp.net-web-api


【解决方案1】:

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

【讨论】:

  • 谢谢,我正在试一试,但它有很多重载,在 MSDN 上没有太多帮助。
  • meh... 不是第二次查看的选项。对于那个很抱歉。麻烦的是,对于“类似路由”的语法,需要将 id 传递给 BeginForm 方法。在此处查看问题和答案:stackoverflow.com/questions/13997629/…
  • 没问题,感谢帮助,我找到了solution
【解决方案2】:

您使用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 - Modify the URL without reloading the page
  2. 您可以重定向请求

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

【讨论】:

  • 好的,我会记住这些,但我相信有一个简单的方法。
  • 至于个人路由 - 不,我没有尝试过,我不知道如何或为什么?
  • 如何:在Global.asax 方法中RegisterRoutes。为什么:我想你不应该这样做,因为你的 Controller/Action/Parameter 与默认路由相同。我只是第一次没有注意到它。
  • 是的,两个 url 都有效,所以映射就在那里,我认为现在它归结为 html &lt;input&gt; 提交将始终将参数放在 url 的末尾 ? 之后。所以也许你提出的其他想法是必要的。
  • 感谢您的建议,我找到了一个简单的解决方案,见answer
【解决方案3】:

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

【讨论】:

  • 谢谢,但没有帮助。也许我做错了,请参阅问题编辑。
  • 尝试使用 FormMethod.Post 而不是 Get
  • 不,这无济于事,不会在 url 中添加任何内容。
  • 就是这样,没有Post方法。只获取。
【解决方案4】:

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

    //
    // 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" />
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2018-11-11
    • 2012-10-05
    • 2010-09-07
    相关资源
    最近更新 更多