我刚刚参与将一系列复杂的工作流程与InfoPath UI迁移到基于Web的UI。我是ASP.Net MVC的新手,但已开始将其作为技术与经典ASP.Net进行评估。
与大多数工作流程一样,在每个州都有许多业务规则可以确定(a)谁可以查看哪些内容; (2)谁可以编辑什么内容; (3)用户操作选项可能是什么(编辑;拒绝;批准)等。实质上,在呈现适当的视图之前,需要将大量逻辑应用于每个请求。在ASP.Net中更有经验,我知道通过页面后面的代码(启用/禁用/隐藏字段)可以轻松地呈现所需的表单。我还没有看到如何用ASP.Net MVC实现这一点(但我意识到在使用MVC时我需要新思维 - '只提供特定View +有限用户操作选项的内容')。
因此,如果使用ASP.Net MVC,看起来我需要创建很多视图。每个视图中的大部分内容都是相同的。对于每个状态中的这些视图,在大多数情况下,只有字段启用状态或按钮会不同。例如:Step01Initiate('已保存'按钮); Step01OriginatorView(具有'编辑'按钮); Step01OriginatorEdit(有'保存'按钮); Step01Review(具有'Accept'/'Reject'按钮); Step01ReviewReject(对于评论者注释;具有“保存”/“取消”按钮)。使用多达六个状态的工作流程,这将产生大量视图。我可以看到在内容方面选择ASP.MVC(1)'thin'视图的优势; (2)在控制器和不同的模型中进行逻辑合并。
我是否正在考虑应用MVC的正确思路 - “充足的观点”;或者有更好的方法来实现我的目标(使用ASP.Net MVC或经典的ASP.Net)?
答案 0 :(得分:1)
我肯定会使用ASP.NET MVC。有了这么多的业务逻辑,我会建议它带来的分离问题会使开发和可维护性变得更容易。
虽然更改页面使其看起来像一个不同的页面(删除/添加按钮等)确实有效,但是在可维护性方面我越来越不舒服,因为它紧密地耦合了UI和逻辑。在我看来,使用视图和控制器是一种更好的方法。
在您的情况下,每个步骤都有一个Controller具有不同的Action。这些操作中的每一个都将返回适合用户的视图。
答案 1 :(得分:0)
我只是花了一些时间研究类似的应用程序。我的第一个建议是尽可能多地从应用程序中获取工作流内容并进入Windows Workflow运行时。它将为您节省很多痛苦和不必要的手动管理状态等。AppFabric最近已经发布/宣布(RTM是6月)。您可以使用它来托管所有工作流程,它将照顾持久性等等。
尽管ASP.NET视图很薄,但您可以在其中使用条件逻辑(在某种程度上)。然后,您可以将当前用户所在的角色放入您的viewmodel中。然后在您的视图代码中,您可以检查用户是否处于特定角色,并根据该角色渲染/排除部分。您还可以使用RenderAction之类的内容来分解视图的常见部分,以避免大量复制/粘贴编程。
您的代码看起来像:
<!-- common html here -->
<% if( model.UserRole.InRole( [some role] ) ) { %>
<input type="button" />
<% } %>
太多可能导致标签汤(and there are ways to clean it up),但听起来你只能局限于用户能够执行的一些操作。
另一种选择是将可用操作列表传递到视图中,然后循环遍历它们并渲染教授一个。这将完全取消用户角色/ etc管理的关注,并将该逻辑进一步移动到您的业务层(它可能属于它)。