1

我有一个 MVC 应用程序,旨在供公司内部使用(但设计时知道最终我们将为客户提供访问权限),该应用程序目前通过互联网 (ssl) 提供服务。我们现在正在考虑为客户提供对其及其帐户的访问权限。个人资料编辑,程序注册,当前服务的状态,非常典型的东西。但我在如何去做这件事上犹豫不决。一定有一些公共访问所独有的东西不适用于公司员工,但我希望尽可能保持 DRY,并尝试保持现有代码的精简。我想出了两个选项,我正在寻找我可能会丢失的意见和见解。我是否犯了任何设计失误来娱乐这个,或者我错过了另一个选择?


MVC4 显示模式

MVC4 提供了(通过 DisplayModes)根据自定义标准提供替代视图的能力。默认实现基于 AgentString,用于为移动设备(平板电脑、手机)提供备用视图。但我已经对其进行了测试,它还可以用于根据其他标准提供替代视图,例如用户信息(处于特定角色)。我想我可以在系统中添加一个公共客户帐户独有的角色,如果定制是主要的,这将导致他们获得备用视图,如果不是,让它回退到使用默认视图,如果定制确实如此不需要全新的观点。他们的其余访问权限将尽可能使用现有权限、角色和安全限制进行处理。我看到的缺点是控制器操作对于员工和公共客户来说都是相同的,因此根据用户是员工还是公共客户,不同的代码路径可能会变得有点混乱。更不用说无意中暴露仅适用于员工的东西的可能性。但它也会使观点非常干燥。

全球.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 的区域,例如作为网站/应用程序的客户端门户。使用这种方法,我应该能够从用于站点主要部分的控制器继承,并在客户端门户需要不同逻辑时根据需要覆盖某些操作,并让其余部分落入基类(我没有还没有测试过这个理论,但我假设它会起作用?)。我认为这会导致 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());
    } 
}

有没有其他人看过类似的东西?在我对我的思考过程获得第二意见之前,我不想在一条或另一条道路上走得太远,因此您可以提供的任何帮助将不胜感激。

4

1 回答 1

0

您是否认为可以使用区域方法(我认为它对您的项目更好)结合部分观点来获得两个领域相同的观点?

这允许您解耦应用程序的两个部分,但您可以重用视图并利用控制器的继承。

于 2013-04-19T17:51:56.060 回答