gpt4 book ai didi

asp.net-mvc - 添加非mvc路由时Html.ActionLink构造错误链接

转载 作者:行者123 更新时间:2023-12-02 05:38:37 24 4
gpt4 key购买 nike

我这里有一个混合了 webform 和 mvc 的应用程序。我指定的路由如下

        routes.Add("AspxRoute", new Route("Upload/New", new WebFormRouteHandler<Page>("~/Uploads.aspx")));

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);

因此,“上传/新建”的虚拟路径实际上映射到 aspx Web 表单页面。

但我的问题是 Html.ActionLink("Test", "Controller", "Action") 现在呈现

/Upload/New?Controller=Controller&Action=Action

查看了 MVC 源代码后,我明白这是因为 ActionLink 调用 RouteCollection.GetVirtualPath(requestContext, routeName, mergedRouteValues) ,其中routeName 保留为空。不知何故,默认使用 AspxRoute 路由来构造 url。我尝试在“AspxRoute”之前添加另一条路由,但似乎它总是默认为非 mvc 路由处理程序。

当routeName为空时RouteCollection.GetVirtualPath如何表现?为什么我的情况会这样?

如何构建正确的 url?我需要编写新的 Htmlhelper 扩展吗?

干杯

最佳答案

另一种选择是向您的 WebFormRoute 添加自定义约束。例如,您可以创建 IRouteConstraint 的实现来匹配 RouteDirection.IncomingRequest,然后使用它来确保该路由被服务器生成的路由(例如 ActionLink)忽略,但仍被客户端生成的请求使用。像这样的东西:

public class IncomingOnlyRouteConstraint: IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest)
{
return true;
}
return false;
}
}

然后将约束添加到您的 route :

routes.Add("AspxRoute", new Route("Upload/New", null, 
new RouteValueDictionary() { {"WebFormsConstraint", new IncomingOnlyRouteConstraint()} },
new WebFormRouteHandler<Page>("~/Uploads.aspx")));

当然,您可能更喜欢添加自己的约束样式,这对实现它的路线有很大限制,但这只是解决问题的一种方法的示例。

关于asp.net-mvc - 添加非mvc路由时Html.ActionLink构造错误链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1470997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com