Как я могу смешать маршруты DynamicData с маршрутами Mvc?
Я пытаюсь создать область для запуска DynamicData с лесами в качестве административной части. Вероятно, это работает как следует, но я не могу заставить работать маршрутизацию.
В моем global.asax у меня есть следующая функция для регистрации маршрутов:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("favicon.ico");
routes.IgnoreRoute("public/{*pathInfo}");
routes.IgnoreRoute("{resource}.js");
routes.IgnoreRoute("{resource}.css");
routes.MapRoute("OrderComment", "Order/{id}/comments",
new { controller = "Order", action = "Comments", id = 0 }, // Parameter defaults
new { controller = new NotEqual("Register", "Product", "Admin") });
routes.MapRoute("Account", "Account/Edit/{accountId}",
new { controller = "Account", action = "Edit", accountId = 0 }, // Parameter defaults
new { controller = new NotEqual("Register", "Product", "Admin") });
routes.MapRoute("Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { controller = new NotEqual("Register", "Product", "Admin") });
if (HostingEnvironment.IsHosted) {
routes.Add(new ServiceRoute("Register", new WebServiceHostFactory(), typeof(RegisterService)));
routes.Add(new ServiceRoute("Product", new WebServiceHostFactory(), typeof(ProductService)));
}
}
В моей области я поместил все особенности DynamicData следующим образом:
открытый класс AdminAreaRegistration: AreaRegistration {
private static MetaModel s_defaultModel = new MetaModel();
public static MetaModel DefaultModel
{
get
{
return s_defaultModel;
}
}
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
DefaultModel.RegisterContext(typeof(diglifeEntities), new ContextConfiguration { ScaffoldAllTables = true });
context.Routes.RouteExistingFiles = true;
context.Routes.Add(new DynamicDataRoute("Admin/{table}/{action}.aspx")
{
Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
Model = DefaultModel,
});
}
}
К сожалению, "лучшее", что случилось со мной до сих пор, было то, что когда я проверяю таблицы по умолчанию, я получаю сообщение о (MetaModel.VisibleTables)
Сообщение = "Значение не может быть нулевым.\ R \n Имя параметра: принципал"
со следующей трассировкой стека:
at System.Web.DynamicData.ModelProviders.TableProvider.CanRead(IPrincipal principal)
at System.Web.DynamicData.MetaTable.CanRead(IPrincipal principal)
at System.Web.DynamicData.MetaModel.IsTableVisible(MetaTable table)
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at System.Web.DynamicData.MetaModel.get_VisibleTables()
Проблема в том, что я не знаю, почему это так. Это маршрутизация или что-то еще? Возможно, это какая-то проблема безопасности или я не могу поместить динамические данные в область?
Сама папка DynamicData находится в корне приложения, так как это соглашение, которое оно использует, и я не собираюсь переопределять это.
Изменить: я нашел этот пост, но, похоже, он ничего не делает для меня.
2 ответа
Решение моих проблем (на которые я снова ответил) состоит в создании PageRoute внутри области регистрации администратора, указывающей на это:
context.Routes.MapPageRoute("Admin",
"admin/{pagename}",
"~/Areas/Admin/Default.aspx",
true);
У меня была похожая проблема. Мне нравится, как динамические данные могут автоматически создавать формы, управляемые данными, но мне также нравится чистый дизайн приложения MVC. В конце концов я решил удалить динамические данные из моего проекта и просто заставить MVC генерировать страницы, используя Dynamic MVC.