MapPageRoute打破了集成MVC / WebForms应用程序中的ActionLinks

时间:2012-12-19 19:16:07

标签: asp.net-mvc webforms actionlink

我有一个在ASP.NET 4.0中开发的现有Web应用程序。我想在应用程序中添加MVC功能,因此我根据Scott Hanselman的文章Integrating ASP.NET MVC 3 into existing upgraded ASP.NET 4 Web Forms applications将MVC集成到应用程序中。因为MVC路由是贪婪的,我将以下代码添加到我的Global.asa中,以便空URL将转到我的Default.aspx:

routes.MapPageRoute("WebFormsDefault", "", "~/Default.aspx");

现在的问题是ActionLinks和RouteLinks无法正确形成。如果我尝试使用以下方法创建操作链接:

@Html.ActionLink("Item List Page", "List", "Item")

创建以下网址:

"/SiteName/?action=List&controller=Item

我发现其他人有几个同样问题的帖子,但没有一个有任何答案。这只是一个错误吗?将MVC集成到WebForms应用程序中通常只是一个坏主意吗?或者有没有办法解决这个问题,以便当用户第一次进入网站并且ActionLinks和RouteLinks正常工作时,我的Default.aspx页面会显示出来?

2 个答案:

答案 0 :(得分:2)

迟到了,但是我觉得迟到总比没有好。我有这个完全相同的问题,我通过分组我的MapPageRoute代码和我的MapRoute代码然后总是首先调用MapRoute代码来解决它。例如:

最初我的路由看起来像这样 -

routes.MapPageRoute("401", "401/", "~/Views/Error/401.aspx");
routes.MapPageRoute("404", "404/", "~/Views/Error/404.aspx");
routes.MapPageRoute("500", "500/", "~/Views/Error/500.aspx");
routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = "" }
            );

等等

这导致我的所有表单操作都被指向一个格式如下的url: / mysite的/ 401动作= X&安培;控制器= Y

显然这没用。通过确保我始终首先设置所有MVC路由,问题自行解决。我最终制作了两个单独的方法,一个用于配置MVC路由,另一个用于配置Webform路由,如下所示:

RouteConfig.RegisterMvcRoutes(RouteTable.Routes);  // contains only MapRoute
RouteConfig.RegisterWFRoutes(RouteTable.Routes);  // contains only MapPageRoute

(这些调用照常进入Global.asax文件并替换RouteConfig.RegisterRoutes)

答案 1 :(得分:0)

我不建议将webforms与MVC混合,但我确实设法通过使用这个有用的帖子来实现这一点: http://bartwullems.blogspot.com/2011/04/combining-aspnet-webforms-and-aspnet.html

我还必须非常小心路线的顺序,这样我最通用的路线就会在我希望作为默认设置提供的aspx页面之后。

这是我完整的RouteConfig:

public static void RegisterRoutes(RouteCollection    routes)
    {
routes.IgnoreRoute({resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "SignUp",
url: "SignUp",
defaults: new { controller = "Profile", action = "SignUp", shortUrl = UrlParameter.Optional });

routes.MapRoute(
name: "Admin",
url: "Admin",
defaults: new { controller = "Admin", action = "Index", shortUrl = UrlParameter.Optional });


//used to get aspx page to render
routes.MapPageRoute("WebForms", "", "~/WebForms/Default.aspx", false, null, new RouteValueDictionary(new { controller = new IncomingRequestConstraint() }));

//this generic route must go last
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
}

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