网址.创建定位标记时未正确构建操作链接



我正在使用Url.Action构建锚链接。 构建时,它不包含控制器方法:

function showDetails(data) {
var link = "@Url.Action("Index", "Detail")" + "/" + data;       
var returnText = "<a target='_blank' href='" + link + "'>" + data + "</a>";
return returnText;
}

在控制台中显示链接时:console.log(link),它给了我/Detail/123而不是/Detail/Index/123

这就是在RouteConfig.cs中定义路由的方式

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);

我根据您的建议添加了以下内容Default路线

routes.MapRoute(
name: "TicketDetail",
url: "Detail/Index/{data}",
defaults: new {controller = "Detail", action = "Index", data  =UrlParameter.Optional }
);

我错过了什么?

好吧,你有一系列问题。 第一

它给了我/Detail/123

而不是/Detail/Index/123

因为Index是默认路由/Detail所以实际上是 100% 正确的。

//                                            Default = Index
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

没有理由在 Asp.Net 看到的 URL 中添加Index。 它确实增加了Detail,因为Detail != Home. 如果将默认值更改为Detail则只会给您/。 如果要强制使用 URL,可以创建自己的帮助程序(从重复的问题/答案)。

public static string AbsoluteAction(this UrlHelper url,
string actionName, string controllerName, object routeValues = null)
{
string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}

然后,您可以在视图中简单地使用它:

@Url.AbsoluteAction("Action", "Controller")

其次,因为您要在客户端添加data作为路径参数而不是查询参数,所以它不起作用。 您可以完全保持代码原样,如果您这样做了:

var link = "@Url.Action("Index", "Detail")" + "?id=" + data;      

var link = "@Url.Action("Index", "Detail")" + "?data=" + data;      

不确定您的方法需要什么,因为您没有将其包含在相关代码中。

您什么也没遗漏,问题是 ASP.NET 注册的默认路由。

我不知道您使用的是哪个版本,但是在我的示例中,我使用了MVC4 VS2015 ASP.NET 并且在文件RouteConfig中.cs在方法RegisterRoutes上注册了默认路由,在某些版本中,您会在Startup.cs上找到此代码。

请注意下面的代码:

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

URL{action} 中 te 操作参数的默认值为"索引",因此 ASP.NET 假定如果抑制此值,则推断要访问此操作,因此它遵循禁止从 URL 中抑制默认值的规则,以了解不必要的内容。

要解决您的问题,您可以将新路由注册为以下代码:

routes.MapRoute(
name: "DetailUrl",
url: "Detail/Index/{data}",
defaults: new { controller = "Detail", action = "Index", data = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

ASP.NET 将根据第一个匹配规则生成链接。

最新更新