在控制器/区域之间共享编辑页面

时间:2011-10-21 07:34:13

标签: asp.net-mvc-3

我正在开发一个MVC3应用程序,其中一些用户应该编辑事件。 “管理员”和“促销员”都应该能够编辑他们的活动。观点是一样的。我为我的管理员和推销员创建了一个区域,因为它们有很多不同的选项。我的结构有点像这样

/admin/events/edit/1
/promoter/events/edit/1

在这两个区域中我使用的是不同的控制器,因为布局页面在启动器/管理员区域应该是不同的。从而导致重复,这就是我在寻找更好的解决方案。我可以放在“共享”文件夹中的视图,但是如何防止有两个方法(每个控制器中有一个)提供相同的视图?一些选择:

  • 对来自实现事件编辑的同一基类的两个控制器进行子类化。这只适用于一次,因为你只能有基类。如果我有其他共享功能,则应该全部进入基类。
  • 将编辑功能从两个控制器委托给另一个类(EditEventController?)
  • 使用AJAX表单,以便仅部分更新页面。这使情况变得复杂。

简而言之:如何在MVC 3应用程序中的不同区域/控制器之间共享编辑页面?

@Added由于评论太小:

我正在使用区域角色,因为我想要该角色的网站的某些视图。像一个管理区域,包含子部分事件/用户和所有其他管理员的东西。在这个管理区域我有一个事件控制器来处理管理区域的事件部分。另一个领域是推动者。它似乎是网站的逻辑划分(因为我可以控制布局,例如每个区域,我可以使用基类控制器来要求某些角色)。你是说这不实用吗?我喜欢单个事件控制器的想法,但我如何根据当前角色获得不同的布局页面/菜单?

1 个答案:

答案 0 :(得分:0)

它应该在一个控制器中。听起来你正在将“区域”与角色和路由混合起来。

这些网址都应该映射到一个操作方法,而不是不同的控制器/区域。

“事件”应该是一个区域,并使用[Authorize]属性或自定义属性,以便管理员和推广人员都可以看到它。

尝试为应用程序中的每个逻辑组件创建一个区域,或者如果您更喜欢使用DDD,则每个“聚合”。

所以在你的活动区域,你可以有这样的路线:

routes.MapRoute(
                "Default",                                             
                "{role}/{controller}/{action}/{id}",                   
                new { controller = "Events", action = "Index", id = "" },
                new { role = new RoleBasedRouteConstraint() } // or you could use regex..
            );

在角色路由令牌上使用路由约束来限制与角色对应的字符串值,以及控制器中基于角色的授权。