当组合asp.net动态数据和MVC时,MetaModel.Visible包含带有Scaffold == false的表

时间:2010-08-12 19:25:39

标签: asp.net asp.net-mvc dynamic-data scaffolding

我通过创建一个新的DD项目并添加MVC内容(引用,路由,使用等)来组合MVC和DD。

default.aspx(来自DD)上的表列表将显示所有表,包括具有[ScaffoldTable(false)]的表。具有Scaffold == true的表的URL具有预期的形式(DD / TableName / List.aspx)。但是,不应显示的表的URL的格式为/ Home / List?Table = TableName。

如果省略MVC路由(Routes.MapRoute),则不会显示带有Scaffold(false)的表。或者您只能省略参数默认值。

我的猜测是动态数据通过检查是否可以为List页面建立路由来确定表是否可见。 DynamicDataRoute将不匹配,因为如果Scaffold == false,则不会生成路由。然而,由于最后的参数默认值,MVC路线将匹配。

我是否正确,这是一个错误还是我在这里完全遗漏了什么?

编辑: 我通过在Scaffold上添加过滤VisibleTables来修复它,但这是一种解决方法......

System.Collections.IList visibleTables = 
   MvcApplication.DefaultModel.VisibleTables.Where(o=>o.Scaffold==true).ToList();

我的RegisterRoutes在global.asax.cs:

    public static void RegisterRoutes(RouteCollection routes)
    {
        DefaultModel.RegisterContext(typeof(studiebase2Entities), new ContextConfiguration() { ScaffoldAllTables = false });

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.Add(new DynamicDataRoute("DD/{table}/{action}.aspx")
        {
            Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
            Model = DefaultModel
        });

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

    }

1 个答案:

答案 0 :(得分:2)

更简洁的解决方法是在MVC路由中添加constraint,以便在指定“Table”时不匹配。例如类似的东西:

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