2

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

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

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

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

创建以下 URL:

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

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

4

2 回答 2

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?action=x&controller=y

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

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

(这些调用像往常一样进入 Global.asax 文件并替换 RouteConfig.RegisterRoutes)

于 2013-04-17T18:27:12.973 回答
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;
}
}
于 2015-11-05T17:38:55.103 回答