MVC 6链接标记帮助程序未创建正确的URL

时间:2015-12-29 15:53:10

标签: asp.net-mvc tag-helpers

我有一个MVC 6项目,其路由设置为:

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}/{closeOnSubmit?}");
            });

我尝试使用标签帮助程序构建超链接,如:

<a asp-controller="MyController" asp-action="Create" asp-route-closeOnSubmit="true" class="fa fa-plus indent-15">+</a>

创建页面并将鼠标悬停在链接上时,它没有closeOnSubmit参数报告为http://localhost/MyController/Create。当我在Chrome的开发者工具中检查HTML时,它看起来像:

<a href class="fa fa-plus indent-15">+</a>

我需要做些什么才能将closeOnSubmit参数正确地附加到路线上?

编辑:
我不完全理解MVC路由,所以很遗憾地提供了一些错误的信息。当我第一次创建我的应用程序时,它的默认路径为:

app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

当试图让这个工作时,我想也许它没有正确路由,因为我没有将closeOnSubmit添加到路由中。在阅读了达林的答案之后,我理解了它,并且在将它添加到路线后肯定是错的。但是,对于这条特定的路线,我不需要传递ID。我尝试更改默认路由,以便它使用closeOnSubmit而不是id,它仍然没有解决链接未正确创建的问题。

在排除故障时,我还发现这些路线比我想象的还要错误。我正在处理的页面是转到http://localhost/ControllerOne/Create生成的。超链接应指向的页面是http://localhost/ControllerTwo/Create'. Even though my asp-controller tag is set to ControllerTwo, all of my hyperlinks are showing as http://ControllerOne/Create`。我有一种感觉,那只是因为空的href属性,但我想知道是什么导致href属性为空。

2 个答案:

答案 0 :(得分:0)

只有路线的最后一个参数可以是可选的。否则,路由引擎根本无法消除您的路由歧义。

当路由引擎遇到这个URL时,请考虑一下:

http://localhost/MyController/Create/true

true令牌是否应绑定到id参数或closeOnSubmit参数?

因此,请确保您的id参数是强制性的:

template: "{controller=Home}/{action=Index}/{id}/{closeOnSubmit?}"

并且在构建网址时已为其指定了值:

<a asp-controller="MyController" asp-action="Create" asp-route-id="1234" asp-route-closeOnSubmit="true" class="fa fa-plus indent-15">+</a>

答案 1 :(得分:0)

哇,PEBKAC。

问题来了,因为我引用的控制器还没有存在。哪个,IIRC,会导致MVC5中的错误,而不是创建一个空的HREF标记。无论哪种方式,我都应该足够聪明地看到那个。