我有一个在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页面会显示出来?
答案 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;
}
}