2010-08-12 76 views
2

J'ai combiné MVC et DD en créant un nouveau projet DD et en ajoutant les trucs MVC (références, routage, utilisations, etc).Lors de la combinaison de données dynamiques asp.net et MVC MetaModel.Visible contient des tables avec Scaffold == false

La liste des tables sur default.aspx (à partir de DD) montrera toutes les tables, incluant celles avec [ScaffoldTable (false)]. Les URL des tables avec Scaffold == true ont la forme attendue (DD/TableName/List.aspx). Toutefois, les URL des tables qui ne doivent pas être affichées sont au format/Home/List? Table = TableName.

Si vous omettez le routage MVC (Routes.MapRoute), les tables avec Scaffold (false) ne sont pas affichées. Ou vous pouvez omettre uniquement les paramètres par défaut.

Je suppose que Dynamic Data détermine si une table est visible en vérifiant si une route peut être faite pour la page Liste. DynamicDataRoute ne correspondra pas car cela ne générera pas de route si Scaffold == false. MAIS ALORS la route MVC va correspondre en raison des paramètres par défaut à la fin.

Ai-je raison et est-ce un bug ou suis-je complètement manquer quelque chose ici?

EDIT: je fixe en ajoutant le filtrage des VisibleTables sur Échafaudage comme ça, mais c'est une solution ...

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

Mes 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 
     ); 

    } 

Répondre

2

Une solution un peu plus propre serait d'ajouter un constraint à votre route MVC afin qu'il ne corresponde pas quand une 'Table' est spécifiée. par exemple. quelque chose comme:

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

Cela fonctionne comme une meilleure solution de contournement que j'avais. L'équipe de Scott Hanselman a confirmé qu'il s'agissait d'un bug alors peut-être que cela sera corrigé dans une future version. –