ASP.NET MVC应用程序路由不适用于动态数据WebForm页面

时间:2009-07-31 22:40:47

标签: asp.net-mvc routing

我需要正确的Global.asax设置才能使我的动态数据站点在ASP.NET MVC项目下运行。路由目前似乎是我的问题。

这是我的global.asax:

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

    MetaModel model = new MetaModel();
    model.RegisterContext(typeof(Models.DBDataContext), new ContextConfiguration() { ScaffoldAllTables = true });
    routes.Add(new DynamicDataRoute("DD/{table}/{action}.aspx") {
        Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
        Model = model
    });

    routes.MapRoute(
        "Assignment",
        "Assignment/{action}/{page}",
        new { controller = "Assignment", action = "Index", page = "" });

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

}

我尝试使用的链接是:

  

http://localhost:64205/DD/Work_Phases/ListDetails.aspx

我收到以下消息:

  '/'应用程序中的服务器错误。该   资源无法找到。描述:   HTTP 404.您正在寻找的资源   for(或其中一个依赖项)可以   已被删除,有它的名字   改变了,或者是暂时的   不可用。请查看   关注URL并确保它是   拼写正确。

     

请求的网址:   /DD/Work_Phases/ListDetails.aspx

我尝试用DynamicData替换DD,因为应用程序内部的文件夹是DynamicData,并且产生了完全相同的结果。

3 个答案:

答案 0 :(得分:3)

网址

http://localhost:64205/DD/Work_Phases/ListDetails.aspx

正在匹配你的第二条(默​​认)路由,它试图命中一个名为“DD”的控制器。

您可能需要另一个看起来像这样的路线:

routes.MapRoute(
    "DD",
    "DD/{action}/{page}",
    new { controller = "NameOfController", action = "Index", page = "" }
);

...虽然我无法想象为什么你需要传递一个页面参数。命中的页面视图取决于控制器方法的返回操作。


为了更好地了解动态数据与ASP.NET MVC的集成,请查看Scott Hanselman's Plugin-Hybrids article.他有一些关于处理不属于MVC的.ASPX文件的详细信息。特别是,如果您有一个不希望由ASP.NET MVC控制器处理的.ASPX,则可以安装忽略路由:

routes.IgnoreRoute("{myWebForms}.aspx/{*pathInfo}");

应该注意的是,ASP.NET MVC是开箱即用的,可以忽略对磁盘上物理存在的文件的URL请求,尽管Scott的IgnoreRoute技术显然更有效。

答案 1 :(得分:3)

网址与您的动态数据路由不匹配,因为它不符合您对其施加的约束。您正在请求操作ListDetails,但只允许这些操作

Constraints = new RouteValueDictionary(
                    new { action = "List|Details|Edit|Insert" }

编辑:您确定存在名为ListDetails的操作吗?然后将上面的约束修改为

Constraints = new RouteValueDictionary(
                    new { action = "ListDetails|List|Details|Edit|Insert" }

为了确保导致路由被忽略的约束,您可以尝试其中一个默认操作吗?例如。

http://localhost:64205/DD/Work_Phases/List.aspx

答案 2 :(得分:0)

要使ASP.NET MVC正常工作,您必须将您尝试访问的URL与路由列表进行匹配。

对于您当前的global.asax,有效网址的示例为:

http://domain/AnyController/AnyAction/AnyParameter
http://domain/Assignment/
http://domain/Assignment/AnyAction/AnyParameter

MVC请求被重定向到正确的Controller类,Action方法,传入参数.MVC请求重定向到任何ASPX类。这是ASP.NET MVC和vanilla ASP.NET Page之间的区别。