如何为具有属性路由的操作定义Html.BeginForm

本文关键字:操作 定义 Html BeginForm 路由 属性 | 更新日期: 2023-09-27 18:22:13

控制器

[HttpGet]
[Route("~/search/{clause}/{skip?}")]
public async Task<ActionResult> Search(string clause, int skip = 0)
{
   ...
}

查看

@using (Html.BeginForm("Index", "search", FormMethod.Get))
{
    @Html.TextBox("clause", null, new { @class = "form-control col-md-4" })
    ...
}

渲染Html

<form action="/search" method="get">
    <input id="clause" name="clause" type="text" value="test">
</form>

我使用[HttpGet]的部分原因是我希望通过http://myapp.com/search/<search values> 访问搜索

当我导航到http://myapp.com/search/test时,一切似乎都很好,但当我试图在文本框中输入新的搜索词并点击回车或提交时,它会导航到http://myapp.com/search?clause=newsearch

我应该怎么做才能使我的文本框导航到http://myapp.com/search/newsearch

如何为具有属性路由的操作定义Html.BeginForm

您的表单生成http://myapp.com/search?clause=newsearch,因为浏览器不知道您的路由(服务器上运行的c#代码)。

为了生成你喜欢的url(http://myapp.com/search/newsearch),你需要javascript来拦截和取消默认提交,并构建一个导航到的url

$('form').submit(function() {
    var baseUrl = $(this).attr('action'); // or var baseUrl = '@Url.Action("Index", "search")';
    var url = baseUrl + '/' + $('clause').val(); // add value for skip if required
    location.href = url; // redirect
    return false; // cancel the default submit
});