在 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 的工作方式。如果您执行<form url="foo" method="get">
并发布表单,那么表单将发布 foo?
param1=value1&...¶mn=valuen
与MVC无关。
此外,该 URL 违反了 REST 的哪一部分?它不是一个 漂亮 URL,但根据 REST 的严格定义,它可以是 RESTful。 REST 未指定查询参数必须位于 URL 段中。在这种情况下,这些是查询参数。
【讨论】:
是的,你是对的 - 谢谢。考虑到这一点,我什至不确定我在想什么——也许只是为了让 MVC 应用程序在表单提交后路由到一个不错的新 URL。后面的 GET/POST 属性会有所帮助。以上是关于在 ASP.NET MVC Preview 4 中使用路由引擎进行表单提交的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net Core 7 preview 4 重磅新特性--限流中间件
.NET 6 Preview 4 已发布,ASP.NET Core 更新内容
ASP.NET MVC 中 Controller.ReadFromRequest 的替代品是啥?