ASP.NET MVC强制使用GET方式提交表单的URL样式

4
我有一个简单的搜索用户表单。
<p>Enter a user's id number to search:</p>

<%  using (Html.BeginForm("Search", "UserAdmin", FormMethod.Get)) { %>
        
        <%= Html.TextBox("id") %>
        
        <input type="submit" value="Search" />
<% } %>

我希望这个链接跳转到useradmin/search/{id},但是链接被渲染为useradmin/search?id={id}

两个URL都是有效的,并且按照我的预期映射到我的操作,我只是认为前者更整洁,想要使用那种样式。

更新:

根据Michael Gattuso的答案,我有一个可行的解决方案。不太优雅,但它可以工作。

<p>Enter a user's id number to search:</p>

<%  using (Html.BeginForm("SearchPost", "UserAdmin")) { %>
        
        <%= Html.TextBox("id") %>
        
        <input type="submit" value="Search" />
<% } %>

    public ActionResult Search(string id)
    {
        var result = _Service.SearchForUsers(id);
        return View(result);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SearchPost(string id)
    {
        return RedirectToAction("Search", new { id = id });
    }

它有什么不优雅的地方,确切地说是什么? - Matthew Groves
您可以通过使用JavaScript拦截表单提交并将输入到文本框中的ID附加到所需的URL(即[window.location='UserAdmin/Search/'+valFromTextbox])来避免重定向。如果禁用了JavaScript,则会恢复到当前的“丑陋”URL。 - Michael Gattuso
1个回答

0
这不是MVC的问题。使用GET的表单请求将根据您获得的渲染将输入附加到查询字符串中。由于请求未经过路由引擎,因此MVC中没有任何东西可以修复此问题。您的选择是POST表单并路由它或使用JavaScript。

更新

要在MVC中执行此操作,请使用表单POST。

<p>Enter a user's id number to search:</p>

<%  using (Html.BeginForm("Search", "UserAdmin", FormMethod.Post)) { %>

        <%= Html.TextBox("id") %>

        <input type="submit" value="Search" />
<% } %>

带有相应的操作:

[AcceptVerb("Post")]
[ActionName("Search")] //I assume your current search action has this same signature so use alias
public ActionResult SearchPost(int id){
  return new ActionResult("Search", new { Id = id });
}

我肯定在某个使用MVC的地方看到了我想要的行为,只是我现在记不清楚具体在哪里了:\ - Kirschstein
当您使用表单GET请求时,浏览器本身会在接触服务器之前生成新的URL - http://example.com/useradmin/search?id={id}。要获得所需的路由,请使用POST提交表单并通过路由引擎进行处理。 - Michael Gattuso
有趣 - 尝试这个但似乎找不到别名。那是beta2属性吗? - Kirschstein
抱歉 - 我的意思是ActionName而不是Alias(在MVC 1中起作用),我是根据记忆在做。我已经更新了。然而,我建议您在JavaScript中实现您想要的功能,并让它自然地退化到目前正在工作的方式。这样,您甚至都不需要在控制器中额外添加Action。 - Michael Gattuso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接