在ASP.NET MVC Preview 4中使用路由引擎进行表单提交
时间:2020-03-05 18:39:05 来源:igfitidea点击:
我正在使用ASP.NET MVC Preview 4,并且想知道如何使用路由引擎进行表单提交。
例如,我有一条这样的路线:
routes.MapRoute( "TestController-TestAction", "TestController.mvc/TestAction/{paramName}", new { controller = "TestController", action = "TestAction", id = "TestTopic" } );
表单声明如下所示:
<% using (Html.Form("TestController", "TestAction", FormMethod.Get)) { %> <input type="text" name="paramName" /> <input type="submit" /> <% } %>
呈现为:
<form method="get" action="/TestController.mvc/TestAction"> <input type="text" name="paramName" /> <input type="submit" /> </form>
表单提交的结果URL为:
localhost/TestController.mvc/TestAction?paramName=value
有什么办法可以将此表单提交路由到所需的URL:
localhost/TestController.mvc/TestAction/value
我能想到的唯一解决方案是创建一个仅检查请求参数的单独操作,或者使用Javascript。
解决方案
回答
在路线中,删除URL的{paramName}部分。它应该是:
TestController.mvc / TestAction
因为这是我们要将请求路由到的URL。然后,表格将发布到该URL。
发布的表单值会自动映射到操作方法的参数,因此不必担心没有将数据传递到操作方法。
回答
我的理解是,这就是HTML的工作方式。如果我们执行<form url =" foo" method =" get">
并发布表单,那么该表单将发布foo?
param1=value1&...¶mn=valuen
它与MVC无关。
此外,该URL违反了REST的哪一部分?它不是一个漂亮的URL,但是通过严格的REST定义,它可以是RESTful。 REST没有指定查询参数必须在URL段中。在这种情况下,这些就是查询参数。
回答
解决方案:
public ActionResult TestAction(string paramName) { if (!String.IsNullOrEmpty(Request["paramName"])) { return RedirectToAction("TestAction", new { paramName = Request["paramName"]}); } /* ... */ }