我有一个MVC应用程序,旨在供内部公司使用(但最终我们将提供客户访问的知识设计),目前通过互联网(ssl)提供。我们现在正在寻求为客户提供访问权限及其帐户。配置文件编辑,程序注册,当前服务的状态,非常典型的东西。但我看到了如何解决这个问题。公共访问必然存在一些不适用于公司员工的事情,但我希望尽可能保持干净,并且仍然试图保持现有代码的简化。我提出了两个选择,我正在寻找可能缺少的意见和见解。我是否承担任何设计失礼,或者我错过了另一种选择?
MVC4 DisplayModes
MVC4提供了(通过DisplayModes)根据自定义标准提供备用视图的功能。默认实现基于AgentString,用于为移动设备(平板电脑,手机)提供备用视图。但我已经对它进行了测试,它也可以用于根据其他标准提供备用视图,例如用户信息(具有特定角色)。我想我可以在系统中添加一个公共客户端帐户独有的角色,如果自定义是主要的,那么会导致他们获得备用视图,如果不是,则让它回退到使用默认视图不需要全新的观点。其余的访问权限将尽可能使用现有权限,角色和安全限制进行处理。我认为,失败是控制器操作对于员工和公共客户都是相同的,因此根据用户是员工还是公共客户端,它可能会因为不同的代码路径而变得有些混乱。更不用说无意中暴露出仅供员工使用的东西的可能性。但它也会使观点非常干净。
的global.asax
var displayModes = DisplayModeProvider.Instance.Modes;
displayModes.Insert(0, new DefaultDisplayMode("Client")
{
ContextCondition = (context => context.User.Identity.IsAuthenticated && context.User.IsInRole("Client"))
});
MVC领域
MVC还提供了使用区域作为在同一站点内提供某种应用程序部分分离的方法的功能。因此,我可以创建一个名为Portal的区域,作为网站/应用程序的客户端门户。使用这种方法,我应该能够从用于站点主要部分的控制器继承,并且当它需要客户端门户的不同逻辑时,根据需要覆盖某些操作,并让其余部分进入基类(我没有' t测试了这个理论,但我认为它会起作用吗?)。我认为这会导致DRY控制器,但对于视图而言不是很多,因为我必须从主站点复制我需要的任何视图,即使它们不需要任何更改。 下面的代码有点人为,但我认为它得到了重点。
namespace MyCompany.Web.Areas.Portal
public class ClientInvoicesController : MyCompany.Web.InvoicesController
{
public new ActionResult List()
{
var clientId = invoiceService.GetCurrentCLientId();
var invoices = invoiceService.GetInvoices(clientId);
return View(invoices.Where(x=>x.HideFromClient != true).ToList());
}
}
还有其他人看过类似的东西吗?在我对自己的思维过程提出第二意见之前,我不希望在一条路上走得太远,所以你能提供的任何帮助都会受到赞赏。
答案 0 :(得分:0)
您认为使用区域方法的可能性(我认为它对您的项目更好)与两个区域相同的视图的部分视图相结合吗?
这允许您解耦应用程序的两个部分,但是您可以重新使用视图并利用控制器的继承。