【问题标题】:asp.net mvc force style of get url on formasp.net mvc 强制获取表单上的 url 样式
【发布时间】:2010-12-23 05:26:26
【问题描述】:

我有一个用于搜索用户的简单表单

<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 });
    }

【问题讨论】:

  • 它到底有什么不优雅的地方?
  • 您可以通过简单地使用 javascript 拦截表单帖子并将输入到文本框中的 id 附加到所需的 url 来避免重定向,即 [window.location='UserAdmin/Search/'+valFromTextbox]。如果 javascript 被禁用,它将恢复到当前的“丑陋”网址

标签: c# asp.net-mvc url routing


【解决方案1】:

这不是 MVC 问题。使用 GET 的表单请求将根据您获得的呈现将输入附加到查询字符串。 MVC 中没有任何东西可以解决这个问题,因为请求不会通过路由引擎。您的选择是发布表单并路由它或使用 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" />
<% } %>

带有相应的Action:

[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 完成的行为,我只是不记得确切的位置:\
  • 当您使用表单 GET 请求时,浏览器本身会在访问服务器之前提供新的 url - example.com/useradmin/search?id={id}。要获得您想要的路由,您必须发布表单并通过路由引擎处理它
  • 有趣 - 尝试这样做,但似乎找不到别名。这是 beta2 属性吗?
  • 对不起 - 我的意思是 ActionName 而不是 Alias(在 MVC 1 中工作)我是从记忆中做的。我已经更新了。但是,我建议您在 javascript 中执行您想要的操作,并让它自然降级为它现在的工作方式。这样,您甚至不需要控制器中的额外操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多