如何将DynamicData路由与Mvc路由混合使用?

时间:2011-01-09 22:16:03

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

我正在尝试使用scaffolding作为管理部分创建一个运行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细节都设置为:

public class 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)的消息

  

消息=“值不能   null。\ r \ nParameter name:principal“

使用以下stacktrace:

   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文件夹本身位于应用程序的根目录中,因为它是它使用的约定,我无意覆盖它。

修改:我发现了this帖子,但似乎没有为我做任何事情。

2 个答案:

答案 0 :(得分:3)

解决我的问题(我自己再次回答)是在Admin区域注册中创建一个PageRoute指向:

context.Routes.MapPageRoute("Admin", 
                            "admin/{pagename}", 
                            "~/Areas/Admin/Default.aspx", 
                            true);

答案 1 :(得分:1)

我有类似的问题。我喜欢动态数据如何自动为您创建数据驱动的表单,但我也喜欢MVC应用程序的简洁设计。我最终决定从我的项目中删除动态数据,让MVC使用Dynamic MVC生成页面。

http://dynamicmvc.com