2011-09-13 74 views
1

我正在构建一些Web用户控件,只是想知道什么是实现属性的正确/最佳实践方法。在这个例子中,他的控制是一个“记分卡”控制,它必须显示一个分数(并且还必须做其他的事情)....使事情变得更容易我使这些代码示例非常简单,但实际上我的控制其他东西,以及与除了在标签中显示它:-)ASP.NET Web用户控件最佳实践

Choice #1 
private int _score; 
public int Score 
{ 
get { return _score; } 
set { _score = value; Refresh(); } 
} 
public void Refresh() 
{ 
lblScore.Text = Score; 
} 


Choice #2: 
public int Score {get;set;} 
protected void PageLoad(object sender, EventArgs e) 
{ 
Refresh(); 
} 
private void Refresh() 
{ 
lblScore.Text = Score; 
} 


Choice #3: 
     public int Score 
    { 
    get { lblScore.Text; } 
    set { lblScore.Text = value; } 
    } 

比分等等,当然,问题是什么是实现控制的分数属性的最佳实践方式....: - )

MadSeb

回答

0

选择1

  • 选择2不在此列,因为您不应将初始化和功能链接到UserControl中的特定页面事件。这是与Page-Lifecycle相关的恶意错误的来源。您可能希望在Page_Load后进行修改(即在页面中按钮的Click事件中),但对于隐式Refresh来说太迟了。
  • 选择3因为只是简单地设置Label的文本而不希望有人记住他必须在设置Score之后调用Refresh。但这取决于多么昂贵“我的控件除了在标签中显示它之外还有其他东西以及得分”。如果您经常更改分数,但不一定需要立即刷新,那么在完成所有初始化后,我会执行Refresh

在我看来,一个UserControl应该封装复杂性,只要它保持足够的灵活性和可重用的控制。不要在背景中做太多“魔术”的事情,可能会导致不同情况下的错误,而您不会很快发现错误。特别是在Setter中通常只应设置相应的变量。

有两种不同的使用情况的用户控件:

  1. 复用性。 如果你的控件只包含很少的控件,但是你想重复使用很多次,我会让控制器获取/设置属性,并且不要在其中执行取决于具体条件的复杂事情。这会降低可重用性。您可能想要提供控制器可以处理的明确方法和事件。
  2. 容器。 如果你的控件的行为类似于一个页面并且有很多控件和功能,它应该最重要的是它本身。你只想提供一些方法和事件(不必一定要处理)。在这种情况下最重要的方法是例如一个public void BindData(),它在控制器设置了必要的变量后进行所有初始化。这是您的Choice 2的替代品。

注意:如果你的分数是存储在lblScore.Text作为字符串无论如何,我宁愿使用标签的Text属性,而不是创造另一个INT-变量(它转换为int的吸气剂)。这具有以下优点:您无需手动将变量存储在ViewState中,因为它已存储。通过这种方式,您无需在每次回发时进行设置。