При объединении asp.net Dynamic Data и MVC MetaModel.Visible содержит таблицы с Scaffold==false

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

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

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

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

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

РЕДАКТИРОВАТЬ: я исправил это, добавив фильтрацию VisibleTables на Scaffold, как это, но это обходной путь...

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 ответ

Решение

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

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new { Table = "" }
    );
Другие вопросы по тегам