asp.net MVC:分层域模型和控制器

时间:2009-09-27 15:07:10

标签: asp.net-mvc domain-driven-design

我的域名模型是这样的:我们有一堆学校作为“等级”的根源。每所学校都有教师和课程,每门课程都有一名教师。我试图用mvc框架的逻辑模拟这个,我很困惑。例如,\ school \ details \ x应该是学校的第一页。这应包含指向其教师列表的链接,以及每个课程的列表。

教师列表意味着索引操作应该与用户正在查看的学校相关:\ teacher \ id其中id是学校。与课程列表相同。然后创建教师或课程也应该参考我们正在看的学校:\ teacher \ create \ x其中x = school。

我如何随身携带学校的身份证?有没有一些巧妙的方法来做,或者我是否需要一直把它传递到需要它的每个视图?它还使网站URL非常神秘。我在想一种方法来制作像{school-alias}\{controller}\{action}\{id}这样的网址结构,但我仍然需要找到一种方法来绕过学校。如果这已经完成,那么我需要实现某种过滤器,如果他请求的schoolId与他的个人资料中的那个不匹配,则不允许用户执行某些操作。

我认为,如果我在URL周围携带schoolid,那么与例如从用户的个人资料中获取schoolId相比,该网站更像REST。

3 个答案:

答案 0 :(得分:1)

我会为每所学校创建首字母缩略词。例如:

学校没有。 1 - ABC 学校没有。 2 - DEF

如果我想列出老师,我会写

http://site-address/ABC/teachers/listhttp://site-address/ABC/teachers

显示有关学校的基本信息

http://site-address/ABC

路由的代码是:

    routes.MapRoute(
            "Default", // Route name
            "{acronym}/{controller}/{action}/{id}", // URL with parameters
            new {controller = "School", action = "Details", id = ""} // Parameter defaults
            );

routes.MapRoute( "Default", // Route name "{acronym}/{controller}/{action}/{id}", // URL with parameters new {controller = "School", action = "Details", id = ""} // Parameter defaults );

我会在教师,学校和班级控制器上创建授权操作过滤器,以检查用户是否可以访问URL中的首字母缩略词参数定义的学校。您可以通过将filterContext.RouteData.Values [“acronym”]与存储在配置文件中的数据进行比较来检查它。

答案 1 :(得分:1)

编写一个扩展方法来重载链接的呈现,从路由数据中提取学校标识符(首字母缩略词或您选择使用的任何内容)并将其添加到已传入的路由值。这样您的操作可以选择使用标识符如果存在但不需要将其添加到视图数据中,您不必记住将其包含在任何操作链接中(您只需记住使用操作链接重载)。

我会让动作链接过载明显不同,所以跟在你后面的任何人都可以看到你正在做一些与众不同的事情。这可以像Html.SchoolActionLink(...)一样简单。

例如: 如果您的网址为http://mydomain.com/abc/teachers/list且您的路线定义为{school} / {controller} / {action},那么路线值字典将在“学校”键上显示值“abc”。路线值可以通过HtmlHelper.ViewContext.RouteData.Values访问。

答案 2 :(得分:0)

最后我回答了我自己的问题。

真正的解决方案是:Restfull Routing。它实现了RoR中的功能,这正是我所需要的。太糟糕了,这不是更多人的要求,所以它可以进入mvc-trunk。