12

我正在使用 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。

4

3 回答 3

9

解决方案:

public ActionResult TestAction(string paramName)
{
    if (!String.IsNullOrEmpty(Request["paramName"]))
    {
        return RedirectToAction("TestAction", new { paramName = Request["paramName"]});
    }
    /* ... */
}
于 2008-09-08T04:58:18.700 回答
3

在您的路线中,去掉 URL 的 {paramName} 部分。它应该是:

测试控制器.mvc/TestAction

因为那是您希望请求路由到的 URL。然后,您的表单将发布到该 URL。发布的表单值会自动映射到操作方法的参数,因此不必担心没有将该数据传递给您的操作方法。

于 2008-08-12T05:24:55.353 回答
3

我的理解是这就是 HTML 的工作方式。如果您执行<form url="foo" method="get">并发布表单,那么表单将发布 foo?

param1=value1&...&paramn=valuen

它与MVC无关。

此外,该 URL 违反了 REST 的哪一部分?它不是一个漂亮的URL,但根据 REST 的严格定义,它可以是 RESTful。REST 未指定查询参数必须位于 URL 段中。在这种情况下,这些是查询参数。

于 2008-08-28T14:16:24.787 回答