2009-07-25 122 views
1

我正在制作一个Web应用程序在asp.net mvc C#与jquery将有不同的定价计划。如何用最少的重复代码制作可维护的代码?

当然,您支付的功能越多,获得的功能越多。

所以我打算使用角色。因此,如果有人购买计划1,那么他们将获得计划1的角色。然后在页面上使用if语句来检查他们是否处于特定角色。如果他们被允许使用该功能生成它。如果不是无所事事。

这可能是很可能是整个页面可能所有角色中,除了页面上也许有功能共享。

现在有人告诉我,我不应该做的,我想它的方式,因为如果我增加更多的功能,然后我的网页会得到if语句比较凌乱,这将是难以维持。

他们说我应该把每个计划作为一个单独的应用程序。所以如果我有2个计划有2个不同的链接去不同的文件。

我同意,它可能会从长远来看更好,因为我不会要保持会附上if语句但我得到的东西是在这种情况下说的人。

在我的网站的未来版本中,我将收到短信和电子邮件警报。

现在我有一个Html表格和一组用户必须完成的任务。在该网站的未来版本中,我将提供通过电子邮件或短信获取警报的选项。如果他们选择通过表格栏中的电子邮件提醒,则会出现信封。

现在,这可能仅仅是人谁是在计划2,而不是计划1所以人的解决方案只是复制和粘贴的所有代码在一个名为Plan2.aspx文件表代码棒。然后为图标添加新行新粘贴代码计划2.

现在我不得不说的一切,除了这个额外的行是在计划2文件的同一个计划1文件。

所以我不是太疯狂了关于这一想法的,因为重复的代码,如果事情是错误的表我现在必须把它变成2个位置没有之一。如果我现在添加第三个计划,我需要跟踪3组具有不同差异的相同代码。

我原来的办法本来在只对计划2表该行会通过if语句检查自己的角色包围。

就像在某些情况下,我可能就能把所有的公共代码到一个局部的控制和所有不同的代码,另一部分控制权,但它的情况是这样,我不知道。

这只是一个例子,会有更多的这些情况。

那么什么是最好的方法,使您的代码可维护,但也有最小数量的重复代码。

对不起这个职位它还挺很难描述我所努力实现和是这样的情形可能是麻烦的可能领域。


编辑


所以,我还是有点被人给出的例子很乱,希望能看到他们,而不是只是存根饱满一点的例子。

我也在想,但我不确定这是好的做法还是什么,可能看起来很奇怪,有些部分。

即使它只是一条线,也能在局部视图中拥有一切共同点。然后有2个单独的链接,并根据他们的角色将部分视图放在一起。

由于jquery的东西,我在考虑2个单独的链接。例如像如果我有这个

<textbox code> 
<textbox code> // this textbox code is only for plan 2 ppl. This textbox needs to go here 
<textbox code> 

每个文本框的标签将是它自己的局部视图(在这种情况下,如此3)

,所以我将有2个aspx页面。

<render partialView 1> 
<render partialView 2> 
<render partialView 3> 

第二

<render partialView 1> 
<render partialView 3> 

然后在每个2个aspx页面都会有不同的JavaScript文件联系起来。

我在想如果我只是喜欢一个JavaScript文件与我的jQuery的人就可以去添加缺少的HTML,并有权访问所有这些功能。

所以我不知道如果我使用“if语句”的方式我会怎样写它。

但是同时在partialView中看起来都很滑稽。就像我正在制作一张桌子或什么的。

一个部分视图将具有开始标记,并且一些行随后X部分视图将具有结束标记。

看起来很奇怪,很难看到整个画面,因为你必须打开X个文件才能看到整个画面。

所以有一个更好的方法。

回答

0

虽然最好的做法不是看if陈述(见Rob Conery的blog post),但我认为一些基本的逻辑是可以接受的。如果你这样做,你应该尝试使用partials来保持视图尽可能的整洁。正如你所指出的那样,你认为这是最好的解决方案。

尽管您的视图逻辑应该尽可能简单,并且您的模型将从继承价格计划信息以节省重复代码本身中受益。

删除了其他代码,因为您指出您只需使用User类。

关于文本框,这可能会更棘手。一个想法是,你可以让你的脚本文件夹包含全局JS,然后是具有特别针对其他角色(例如角色2和3)的JS的子文件夹。这些可以通过自定义路由约束来保护,以防止用户在没有相关级别的身份验证的情况下访问文件/文件夹。您还应该使用web.config来提供类似的保护级别。那,或者只是使用web.config文件。

+0

嗨,首先我仍在寻找如何做最佳实践。我每次都会做最佳实践吗?可能不是,但仍然很好知道。 我想尝试一下这个人告诉我和我想做什么的混合,这可能是一个好方法。 就像我只需要一个标签的情况一样,将代码复制两次似乎很愚蠢。 所以我不知道你的东西与模型。你为什么需要使用模型?难道你不能只是去“User.IsInRole(”角色“)”而不是做一个模型? 我不太确定的另一件事是说一个定价计划有一个额外的文本框 – chobo2 2009-07-26 04:20:16

2

组件的抽象程度如何?

我的幼稚方法是创建一个单独的图层,将组件展示给用户界面。就像一个仓库模式,用这样的方法:

public IEnumerable<PlanRestrictedFeature> GetFeaturesForPlan(Role r) 
{ 
    //return all features that the user has access to based on role 
    //this forces all this logic to exist in one place for maintainability 
} 

当然,该方法也可以采取在一个字符串,枚举,或计划对象,如果你有一个。在内部,这可能使用某种类型的地图来简化事情。

然后,View可以简单地调用每个组件的Render方法。确保存储库以正确的顺序将它们传回以进行渲染,并依靠CSS进行布局。

+0

对不起,你的意思是“组件​​的抽象程度如何?” 另外,我并没有遵循太多的规定,你可以掀起一个非常简单的例子,仅仅足以向我展示你正在尝试做什么? – chobo2 2009-07-25 14:47:35