ASP.NET Web用户控件的最佳实践

时间:2011-09-13 07:17:38

标签: asp.net user-controls webforms

我正在构建一些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; }
    }

所以,当然,问题是实现控件的Score属性的最佳实践方法是什么...... :-)

MadSeb

1 个答案:

答案 0 :(得分:0)

选择1

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

在我看来,UserControl应该封装复杂性,只要它保持足够的灵活性和控制权以便可重用。不要在后台做太多“神奇”的事情,这些事情可能会导致你不会很快找到的不同条件下的错误。在Setter中尤其如此,通常只应设置相应的变量。

UserControl有两种不同的用例:

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

    注意:如果你的得分无论如何都以lblScore.Text的形式存储在字符串中,我宁愿使用标签的Text属性而不是创建另一个int-variable(强制转换)它到getter中的int)。这样做的好处是您不需要手动将变量存储在ViewState中,因为它已经存储了。通过这种方式,您无需在每次回发时设置它。