在 ASP.NET MVC Preview 4 中使用路由引擎进行表单提交

Posted

技术标签:

【中文标题】在 ASP.NET MVC Preview 4 中使用路由引擎进行表单提交【英文标题】:Use the routing engine for form submissions in ASP.NET MVC Preview 4 【发布时间】:2010-09-05 17:28:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

解决方案:

public ActionResult TestAction(string paramName)

    if (!String.IsNullOrEmpty(Request["paramName"]))
    
        return RedirectToAction("TestAction", new  paramName = Request["paramName"]);
    
    /* ... */

【讨论】:

@Maslow 是的! 302 重定向将始终存在【参考方案2】:

在您的路由中,去掉 URL 的 paramName 部分。应该是:

TestController.mvc/TestAction

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

【讨论】:

【参考方案3】:

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

param1=value1&...&paramn=valuen

与MVC无关。

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

【讨论】:

是的,你是对的 - 谢谢。考虑到这一点,我什至不确定我在想什么——也许只是为了让 MVC 应用程序在表单提交后路由到一个不错的新 URL。后面的 GET/POST 属性会有所帮助。

以上是关于在 ASP.NET MVC Preview 4 中使用路由引擎进行表单提交的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中强制执行关注点分离?

Asp.Net Core 7 preview 4 重磅新特性--限流中间件

.NET 6 Preview 4 已发布,ASP.NET Core 更新内容

ASP.NET MVC 中 Controller.ReadFromRequest 的替代品是啥?

Asp.Net MVC:如何获取当前控制器/视图的虚拟 url?

在 ASP.NET MVC 4 中添加服务引用