2011-10-21 50 views
0

我正在开发一个MVC3应用程序,其中一些用户应该编辑事件。 “管理员”和“发起人”都应该能够编辑他们的活动。视图是一样的。我创建了一个面积为我的管理者和推动者,因为他们有非常不同的选择。我的结构有点像这样在控制器/区域之间共享编辑页面

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

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

  • 从同一基类中实现事件编辑的两个控制器的子类。因为只有基类,所以这只能工作一次。如果我有其他共享功能,这应该全部进入基类。
  • 将编辑功能从两个控制器委派给另一个类(EditEventController?)
  • 使用AJAX窗体,因此页面只是部分更新。这使情况复杂化。

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

@Added作为注释太小:

我使用面积对角色,因为我希望自己的网站该角色的某些观点。就像一个管理区,包含子事件/用户和所有其他管理员的东西。在这个管理区域中,我有一个eventscontroller来处理管理区域的事件部分。另一个领域是推动者的领域。它看起来像是网站的逻辑分支(因为我可以控制每个区域的布局,并且我可以使用基类控制器来要求某些角色)。你是否说这不实际?我喜欢单个事件控制器的想法,但我如何根据当前角色获得不同的布局页面/菜单?

回答

0

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

这两项的URL应该映射到一个操作方法,而不是不同的控制器/区域。

“事件”应该是一个区域,并使用[Authorize]属性或自定义属性,以允许它由管理员和推动者可见。

打算创建一个面积为您的应用程序的每个逻辑组件,或者如果你喜欢DDD发言,每个“聚集”。

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

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

,并使用路由约束的作用路线令牌来限制对应角色的字符串值,除了基于角色的授权,您可以在控制器中使用。

+0

这将如何制定出将我有一个像“/管理/事件/编辑/ 1”将映射到事件控制器网址吗?我如何找出控制器在哪个角色下被访问呢? – Gluip

+0

@Gluip - 你可以在你的控制器上使用'[Authorize(Roles =“Admin,Promoter”)]'是你的意思吗? – RPM1984

相关问题