我该如何学会停止担心并热爱ASP.NET MVC Forms?

问题描述:

MVC鼓励使用RESTful URL,但HTML表单本质上是将数据附加到查询字符串值中。我的动作将“文本”作为字符串参数。而我的形式是:我该如何学会停止担心并热爱ASP.NET MVC Forms?

<% using(Html.BeginForm("Action", "Controller")) { %> 
    <%= Html.TextBox("text") %> 
    <input type="submit" value="submit" /> 
<% } %> 

我的动作是:

public ActionResult Action(string text) 
{ 
    ... 
    return toInnocence; 
} 

有两种不同的URL,你的行动可以映射到:

  1. ~/Controller/Action/textvalue感谢您的路线图{控制器}/{action}/{text}
  2. ~/Controller/Action?text=textvalue从表单提交时

我的问题是:

如何区分两种形式并在后一种情况下进行重定向?第二种形式打破了RESTful原则。那里的最佳做法是什么?我不想查询RouteData.Values集合,因为它以自然,直接的方式打破了将请求参数映射到函数参数的整个目的。这是一个非常基本的场景,我希望MVC能够很好地处理这个问题。

第二种形式不映射到控制器操作中的“text”参数。为什么?我怎样才能创建相同动作的重载版本呢?我是否必须创建一个新操作并将其用于表单提交?当然,我可以解决所有这些问题,但同时我害怕在某个地方错过大局。

看起来好像人们相处得很顺利,所以我觉得我是唯一一个被路由值与查询字符串混淆的人。

编辑:我看着*是如何做到这一点的。它针对“表单获取者”和实际宁静的URL使用单独的操作,并根据需要从一个到另一个重定向。我想这将是最好的方式。

+0

我不明白如果第一种形式不是第二种形式可能会违反REST。要么他们都是,要么都不是。 – qid 2009-12-15 16:13:18

+0

如果查询字符串完全描述了一个URL,为什么我们首先要有URL路由?我们可以与Controller.aspx?action = action&id = id表单相处吗? – 2009-12-15 16:26:40

浏览器的默认操作是将GET表单中的值放入查询字符串中。他们都将解决路线并采取相同的行动。

{ controller = "Controller", "Action", id = null, text = "textvalue" } 

由于缺省路由的存在,会正确解析。

我能想到做你所要求的唯一方法就是改变形式。不要提交“GET”请求,因为你不需要POST(你可以用JS做到这一点,并且友好的降级到POST)并重定向到GET,所以不要提交“GET”请求。

+0

那么最佳做法是对表单提交和URL使用单独的操作? – 2009-12-15 16:12:08

+1

查看Post-Redirect获取的#13:http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx IMO ,一个帖子有点多。您可以使用JS创建放置请求。 (Put请求不会创建典型的浏览器“重新提交POST数据?”弹出窗口。) – 2009-12-15 16:30:39