一直不是很明白,作为用户控件,应该掌握多少权力?
2008-06-25 11:33
295 查看
ASP.NET中有用户控件,这为开发提供了极大的便利,功能分开做成控件,一方面是解放了像ASP、PHP中页面太“重”的局面,一方面是控件是可复用的。
但是有个问题,我却一直不是很明白:
一个.ascx的用户控件,它有自己的生命周期(当然更多时候是基本上和页面同步的),它甚至有自己的Page_Load事件,ASP.NET也直接赋予了用户控件以Request, Response, Session等权力,这极大的强化了用户控件的能力,但是却给我带来了一个奇怪的困惑——用户控件到底应该掌管多大的权力?或者说,它的逻辑范围应该有多大?
在我看来,用户控件是不应该直接去访问Request的(比如Request.QueryString),因为那是页面级别的,而一个用户控件不应该知道自己出现在哪个页面里,所以用户控件是不应该去访问页面级的东西的。所以我通常都是给用户控件制定好Property,然后由aspx来获取到QueryString,再给用户控件赋值。我觉得这样做,可以比直接在用户控件里使用Request.QueryString获取参数更能复用,因为用户控件应该是页面无关的。
第二个,是一个很有趣的话题,用户控件该不该自发地去决定状态?可能这句话说的不是很清楚,举个例子:一个控件的作用是:如果用户没有登录,则显示登录界面,如果已经登录,则显示欢迎界面。对于这个控件而言,它是存在不同的状态的,而这个状态是又控件自发地去获取(比如通过Page.User.IsInRole),还是在aspx里用同样的方法去获取状态,再给控件赋值呢?也许这个问题比较钻牛角尖吧,不过我还是比较想不明白,现在对于这种用户控件我一般都是让控件自己判断状态,省的页面再给它赋值。
再一个就是用户控件是否应该访问数据——当然在这里我并不是指直接访问数据,而是通过数据访问层去访问?我觉得这是一个很奇怪的问题,举个例子,一个控件的作用是,显示自己的心情短语,并且可以编辑,并且更新。这时候,控件就涉及到了数据访问。控件先要获取到了当前的心情短语,显示出来;如果用户编辑,它又要把心情短语的数据更新。从逻辑上看,这很正常,控件维护着自己的逻辑:Read->View->Update->View again。但是给人很奇怪的感觉:这里控件访问了数据,我不知道这是“对的”还是“错的”(虽然很可能根本就没有对错之分),如果说是不对的,那么应该怎么做呢?难道是给控件制定一个OnMoodWordsUpdate事件,然后又让页aspx来处理这个事件吗?这样也很奇怪,因为虽然数据访问的权力交给了page,但是如果这个控件需要在多个地方使用,那么就要多次处理它的OnMoodWordsUpdate事件,显然这些个事件处理都是相同的,这就违背DRY原则了。所以我现在还是把这样的权力留在了控件里面,让它有权访问数据。
看来自己的功力着实很浅,而且也许钻牛角尖走歪路了也说不一定,路还很长,必须继续努力啊。
但是有个问题,我却一直不是很明白:
一个.ascx的用户控件,它有自己的生命周期(当然更多时候是基本上和页面同步的),它甚至有自己的Page_Load事件,ASP.NET也直接赋予了用户控件以Request, Response, Session等权力,这极大的强化了用户控件的能力,但是却给我带来了一个奇怪的困惑——用户控件到底应该掌管多大的权力?或者说,它的逻辑范围应该有多大?
在我看来,用户控件是不应该直接去访问Request的(比如Request.QueryString),因为那是页面级别的,而一个用户控件不应该知道自己出现在哪个页面里,所以用户控件是不应该去访问页面级的东西的。所以我通常都是给用户控件制定好Property,然后由aspx来获取到QueryString,再给用户控件赋值。我觉得这样做,可以比直接在用户控件里使用Request.QueryString获取参数更能复用,因为用户控件应该是页面无关的。
第二个,是一个很有趣的话题,用户控件该不该自发地去决定状态?可能这句话说的不是很清楚,举个例子:一个控件的作用是:如果用户没有登录,则显示登录界面,如果已经登录,则显示欢迎界面。对于这个控件而言,它是存在不同的状态的,而这个状态是又控件自发地去获取(比如通过Page.User.IsInRole),还是在aspx里用同样的方法去获取状态,再给控件赋值呢?也许这个问题比较钻牛角尖吧,不过我还是比较想不明白,现在对于这种用户控件我一般都是让控件自己判断状态,省的页面再给它赋值。
再一个就是用户控件是否应该访问数据——当然在这里我并不是指直接访问数据,而是通过数据访问层去访问?我觉得这是一个很奇怪的问题,举个例子,一个控件的作用是,显示自己的心情短语,并且可以编辑,并且更新。这时候,控件就涉及到了数据访问。控件先要获取到了当前的心情短语,显示出来;如果用户编辑,它又要把心情短语的数据更新。从逻辑上看,这很正常,控件维护着自己的逻辑:Read->View->Update->View again。但是给人很奇怪的感觉:这里控件访问了数据,我不知道这是“对的”还是“错的”(虽然很可能根本就没有对错之分),如果说是不对的,那么应该怎么做呢?难道是给控件制定一个OnMoodWordsUpdate事件,然后又让页aspx来处理这个事件吗?这样也很奇怪,因为虽然数据访问的权力交给了page,但是如果这个控件需要在多个地方使用,那么就要多次处理它的OnMoodWordsUpdate事件,显然这些个事件处理都是相同的,这就违背DRY原则了。所以我现在还是把这样的权力留在了控件里面,让它有权访问数据。
看来自己的功力着实很浅,而且也许钻牛角尖走歪路了也说不一定,路还很长,必须继续努力啊。
相关文章推荐
- 后台C#代码获取html控件的值使用的Request.Form["name"] 中间的那个应该是空间的name 而不是id
- 作为一个软件工程师,在接下来的 5-10 年内应该掌握的技术
- 作为java高级程序员应该掌握什么?
- 作为Java程序员应该掌握的10项技能
- 作为Java程序员应该掌握的10项技能
- 作为一名架构师,我们应该掌握哪些技术呢?
- 作为网络管理员到底应该掌握什么知识?
- 利用IFRAME 让每个页面都继承菜单控 不是用户自定义控件来实现的
- 我是一个商人,我不应该考虑穷人。如果考虑穷人,我作为一个企业的管理者就是错误的。因为投资者是让我拿这个钱去赚钱,而不是去救济穷人
- 后台C#代码获取html控件的值使用的Request.Form["name"] 中间的那个应该是空间的name 而不是id
- 自定义cell上的控件关联的变量一直为nil,研究了好长时间,操作应该没有错误,求大神帮忙
- 顶级黑客应该要掌握的编程语言:想成为黑客吗?这不是梦!
- (while)要求用户输入帐号、密码,只要不是admin和888就一直提示要求重新输入
- 作为一名架构师,我们应该掌握哪些技术呢?
- MOSS 2007 入门(6) : 使用一个Code-behind的用户控件作为WebPart
- 作为一个初学者或者进阶者,这并没有什么错。当一个有能力的程序员而不是领导者,这也没有什么错。真正的错误是,当你知道应该如何去提高时仍然选择做一名初学者。