Asp.net mvc 我如何才能学会停止担忧并热爱ASP.NET MVC表单?

Asp.net mvc 我如何才能学会停止担忧并热爱ASP.NET MVC表单?,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,MVC鼓励RESTful URL,但HTML表单本质上会将数据附加到查询字符串值中。我的操作将“text”作为字符串参数。我的表格是: <% using(Html.BeginForm("Action", "Controller")) { %> <%= Html.TextBox("text") %> <input type="submit" value="submit" /> <% } %> 您的操作可以映射到两个不同的URL: ~/Con

MVC鼓励RESTful URL,但HTML表单本质上会将数据附加到查询字符串值中。我的操作将“text”作为字符串参数。我的表格是:

<% using(Html.BeginForm("Action", "Controller")) { %>
  <%= Html.TextBox("text") %>
  <input type="submit" value="submit" />
<% } %>
您的操作可以映射到两个不同的URL:

  • ~/Controller/Action/textvalue
    感谢您的路线图{Controller}/{Action}/{text}
  • ~/Controller/Action?text=textvalue
    从表单提交时
  • 我的问题是:

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

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

    看起来人们正在轻松地处理这些问题,所以我觉得我是唯一一个对路由值和查询字符串感到困惑的人


    编辑:我查看了维基百科是如何做到这一点的。它对“formgetter”和实际的restful URL使用单独的操作,并根据需要从一个URL重定向到另一个URL。我想这是最好的方法。

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

    { controller = "Controller", "Action", id = null, text = "textvalue" }
    
    由于存在默认路由,这将正确解决


    我能想到的唯一办法就是改变表格。与其提交“GET”请求,不如将其作为PUT提交,因为您不需要POST(您可以使用JS,使用友好的降级POST)并重定向到GET。

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

    { controller = "Controller", "Action", id = null, text = "textvalue" }
    
    由于存在默认路由,这将正确解决


    我能想到的唯一办法就是改变表格。不要提交“GET”请求,而是作为PUT提交,因为你不需要POST(你可以使用JS,使用友好的降级到POST)并重定向到GET。

    所以最好的做法是对表单提交和URL使用单独的操作?查看#13 on POST redirect GET:IMO,POST有点多。您可以使用JS创建put请求。(Put请求不会创建典型的浏览器“重新提交帖子数据?”弹出窗口。)因此,最佳做法是对表单提交和URL使用单独的操作?请查看#13 on POST Redirect Get:IMO,帖子有点多。您可以使用JS创建put请求。(Put请求不会创建典型的浏览器“Resubmit POST data?”弹出窗口。)如果第一个表单没有,我不认为第二个表单会违反REST。要么两者都是,要么两者都不是。如果查询字符串完美地描述了URL是什么,那么为什么我们首先要进行URL路由?我们也可以使用Controller.aspx?action=action&id=id表单?如果第一个表单没有,我不认为第二个表单会违反REST。要么两者都是,要么两者都不是。如果查询字符串完美地描述了URL是什么,那么为什么我们首先要进行URL路由?我们还可以使用Controller.aspx?action=action&id=id表单?