如何用MVC Core表单标签助手继承当前视图URL作为action属性?
在ASP.NET Core MVC中实现MVC5风格的自动路由表单
在MVC5及更早版本里,我们习惯用@Html.BeginForm()来创建无需手动指定控制器和动作的表单——它会自动根据当前请求的URL生成对应的action属性,不管是在编辑页还是新增页都能直接复用,非常省心。不过换到ASP.NET Core MVC的标签助手语法时,你试了几种写法都没得到预期效果,确实容易踩这个小坑。
正确的标签助手写法
其实核心很简单:你只需要给<form>标签指定method属性(通常是post,对应大部分表单提交场景),不需要额外添加asp-controller、asp-action或者asp-route属性,ASP.NET Core的表单标签助手会自动读取当前请求的路由上下文,把当前URL填充为action属性值。
举个例子:
当你在
/books/2/edit页面中使用这段代码:<form method="post"> <!-- 表单输入控件等内容 --> </form>生成的最终HTML会是:
<form method="post" action="/books/2/edit"> <!-- 表单输入控件等内容 --> </form>如果是在
/books/add页面中使用完全相同的代码,生成的HTML则是:<form method="post" action="/books/add"> <!-- 表单输入控件等内容 --> </form>
为什么你之前的写法无效?
你尝试的几种写法要么没有触发标签助手的自动填充逻辑,要么因为传入空值覆盖了默认行为:
<form></form>:没有指定method属性时,标签助手不会自动填充action(默认GET请求的场景下,浏览器会用当前URL作为提交目标,但标签助手不会显式生成action属性)<form asp-route=""></form>或<form asp-controller="" asp-action=""></form>:传入空值的路由/控制器/动作参数,会让标签助手放弃自动填充逻辑,最终生成空的action属性
如果你的表单确实需要使用GET方法,只需要改成<form method="get">即可,标签助手同样会自动填充当前URL作为action值。
内容的提问来源于stack exchange,提问作者Alexandre Jobin
相关产品推荐
相关产品推荐

