1

我的设置

我有一组正常方式的控制器,其中有它们常用的 CRUD 操作方法。这些控制器的示例是推荐、画廊和常见问题解答。这些在 Entity Framework 中有支持模型,例如 Testimonial、Gallery 和 FAQ。

您可以通过这种 URL 获得这些:/Galleries/Edit/2 到目前为止一切都很好,并且所有默认约定......

我还有一组需要在其中包含可编辑内容的页面,这些页面的内容通过实体框架从数据库中填充。他们使用称为“Page”的 EF 模型。这有一个内容属性 (html) 和一个名称属性,以便我可以匹配传入的请求。这些页面是主页、关于和价格页面。

我选择了 Home 控制器来执行此操作 - 我打算让索引 Action 通过 name 参数确定要从 DB 加载的页面:

 [AllowAnonymous]
    public ActionResult Index(string name = "Home")
    {
        // look up the page by name in the DB.
        var model = context.Pages.FirstOrDefault(p => p.Title == name);

        // trap errors.
        if (model == null)
        {
            return RedirectToAction("NotFound", "Error", new { aspxerrorpath = name } );
        }

        // normal path
        return View(model);
    }

因此,理论上我可以向 Pages 表/DbSet 添加新项目,这些项目将正确映射到此控制器和操作。然后,我将为管理员添加一个编辑操作,以编辑与上述索引操作具有相同签名的内容。


问题

问题来自路由请求......

我有 2 条初始路线:

routes.MapRoute("DynamicAccess",
                "{name}/{action}",
                new { controller = "Home", action = "Index" });

routes.MapRoute("Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action="Index", id=UrlParameter.Optional});

当我转到“Galleries/”时,它会失败,因为它每次都通过 Home 控制器,如果我交换它们就会失败。我也通过家庭控制器收到对 Scripts/ 文件夹的请求......


我的临时解决方案

我当前的路线现在看起来像这样:

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("favicon.ico");

        routes.MapRoute("Gallery",
                        "Gallery/{action}/{id}",
                        new { controller = "Galleries", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute("Testimonials",
                        "Testimonials/{action}/{id}",
                        new { controller = "Testimonials", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute("FAQs",
                        "FAQs/{action}/{id}",
                        new { controller = "FAQs", action = "Index", id = UrlParameter.Optional });

        routes.MapRoute("DynamicAccess",
                       "{name}/{action}",
                       new { controller = "Home", action = "Index" });

        routes.MapRoute("Default",
                        "{controller}/{action}/{id}",
                        new { controller = "Home", action="Index", id=UrlParameter.Optional});

        routes.MapRoute("Root",
                        "",
                        new { controller = "Home", action = "Index" });


        routes.MapRoute("AdminAccess",
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
            new { authenticated = new AuthenticatedAdminRouteConstraint() });

您可以在这里看到,我必须在动态解析的主路由的路由上方为我的每个静态页面声明一个路由。


问题

这对我来说看起来很笨拙 - 必须将每个非动态页面添加到我的路由表中。任何人都可以指出我这样做的更清洁的方式吗?

提前致谢。

4

1 回答 1

0

为什么不对您的静态路由施加约束,这将允许不匹配的路由落入动态路由?

routes.MapRoute("default",
                "{controller}/{action}/{id}",
                new {controller="home", action="index", id=UrlParameter.Optional},
                new {controller="^(|home|gallery|testimonial|faq)$"});

routes.MapRoute("dynamic",
                "{name}/{action}",
                new {controller="home", action="index"});

您必须更改控制器以匹配约束中的单数名称,但除此之外,它应该可以工作。

于 2013-09-10T09:07:22.967 回答