ASP.NET MVC2和GET请求的干净URL

时间:2010-07-21 08:54:41

标签: .net asp.net-mvc-2

我有一个非常简单的形式:

<% Html.BeginForm("Listing", "Home", Nothing, FormMethod.Get) %>
<%= Html.TextBox("id")%>
<%= Html.TextBox("id2")%>
<input type="submit" value="Submit" />
<% Html.EndForm()%>

这将生成一个包含两个输入字段的表单。如果我输入'test1'和'test2'作为文本并提交表单,最终结果将是:

http:// localhost/Home/Listing?id=test1&id2=test2

有没有办法配置MVC2框架,以便最终结果如下:

http://localhost/Home/Listing/test1/test2

当然,替代方案是编写一个小的Javascript来拦截表单提交,构建URL并在客户端重定向用户,或者改为执行POST,构造URL然后在服务器上重定向用户侧。

2 个答案:

答案 0 :(得分:3)

就个人而言,我会在这里关注PRG pattern

用户填写您的表单,然后将POST编辑回服务器,您对所需数据执行任何操作,然后通过GET将用户重定向到适当的位置(重定向)行动,路线等)。

这对您有几个好处。第一个也是最明显的是,用户现在可以刷新他们的目标页面等而没有可怕的“刷新此页面将bla bla发回服务器”消息。

您的第二个好处是,您现在可以将用户重定向到您喜欢的网址。在您的情况下,您将构建您将要重定向的URL,然后在途中发送它们。 即http://localhost/Home/Listing/test1/test2

答案 1 :(得分:0)

首先,如果您使用的是MVC表单,请使用

<%= Html.DisplayFor(m => m.Id2) %>

而不是手动绘制它们。

并且Html表单不可能直接将值放入URL中。他们要么把它放在POST(标题变量)或GET(查询字符串)中。因此,如果你想要这种行为,你必须自己做Javascript。

和顺便说一下,如果你的路线接受了价值,这只能起作用。

context.MapRoute("{controller}/{action}/{id}/{id2}")