我正在构建一些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
答案 0 :(得分:0)
选择1
Refresh
来说已经太晚了。Label
的文本,您不希望有人记住他必须在设置Refresh
后调用Score
。但这取决于“我的控件除了在标签中显示其他东西以及分数”的成本有多贵。如果您经常更改分数但不一定需要立即刷新,我会在所有初始化完成后执行Refresh
。在我看来,UserControl应该封装复杂性,只要它保持足够的灵活性和控制权以便可重用。不要在后台做太多“神奇”的事情,这些事情可能会导致你不会很快找到的不同条件下的错误。在Setter
中尤其如此,通常只应设置相应的变量。
UserControl有两种不同的用例:
public void BindData()
,它在控制器设置了必要的变量后进行所有初始化。这是Choice 2
。 注意:如果你的得分无论如何都以lblScore.Text
的形式存储在字符串中,我宁愿使用标签的Text
属性而不是创建另一个int-variable(强制转换)它到getter中的int)。这样做的好处是您不需要手动将变量存储在ViewState中,因为它已经存储了。通过这种方式,您无需在每次回发时设置它。