При объединении asp.net Динамические данные и метамодель MVC.Visible содержат таблицы со скаффолдом==false

#asp.net #asp.net-mvc #dynamic-data #scaffolding

#asp.net #asp.net-mvc #dynamic-data #скаффолдинг

Вопрос:

Я объединил MVC и DD, создав новый проект DD и добавив материал MVC (ссылки, маршрутизацию, использование и т.д.).

В списке таблиц в default.aspx (из DD) будут показаны все таблицы, включая таблицы с [ScaffoldTable(false)]. URL-адреса таблиц со Скаффолдом==true имеют ожидаемую форму (DD/TableName/List.aspx). Однако URL-адреса таблиц, которые не должны отображаться, находятся в форме / Home/List?Таблица=имя_таблицы.

Если вы не учитываете маршрутизацию MVC (Routes.MapRoute) тогда таблицы со скаффолдом (false) не отображаются. Или вы можете не указывать только параметры по умолчанию.

Я предполагаю, что динамические данные определяют, видна ли таблица, проверяя, можно ли проложить маршрут к странице списка. DynamicDataRoute не будет соответствовать, потому что это не сгенерирует маршрут, если Scaffold==false. НО ТОГДА маршрут MVC будет совпадать из-за параметров по умолчанию в конце.

Я прав, и это ошибка, или я полностью что-то здесь упускаю?

РЕДАКТИРОВАТЬ: Я исправил это, добавив фильтрацию видимых таблиц в Scaffold следующим образом, но это обходной путь…

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

Мои маршруты регистрации в 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:

Несколько более чистым решением было бы добавить ограничение к вашему маршруту MVC, чтобы оно не совпадало при указании ‘Table’ . например, что-то вроде:

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

Комментарии:

1. Это работает как лучшее решение, чем у меня было. Команда Скотта Хансельмана подтвердила, что это ошибка, поэтому, возможно, она будет исправлена в будущей версии.