硬代码年份列表?

时间:2009-10-14 01:51:13

标签: c# asp.net

这就是场景。您有一个网络表单,并且您想提示客户选择他们的出生年份。

a)硬编码下拉列表中的值? b)从数据库表中获取有效年份

我可以看到维护噩梦,在任何地方复制.aspx文件中硬编码的一组年份。

更新

for循环不理想(维护噩梦和容易出错)。然后,用户必须筛选120年来尚未到达的地方。

我仍然喜欢数据库方法:

* Single point of data
* No duplication of code
* Update the table as needed to add more years
* Year table values could be used for some other dropdown for some other purpose entirely for something other than Birth year

这很简单。无需在任何地方更新代码。我觉得像这样的通用数据,我们不应该把这个shiza硬编码成一堆完全反对重用和容易出错的页面......真的不是实用的。我会把这个点击给DB。

更新了(再次......考虑到这一点后):

这是我的想法。只需创建一个名为GetYears的实用程序或辅助方法,它运行该循环并返回List<int>,我可以将其绑定到我想要的任何内容(下拉列表等)。我喜欢web.config维护那一年的想法。

6 个答案:

答案 0 :(得分:20)

C)使用for循环在您选择的范围内生成年份。

像这个伪代码一样简单:

for (int i = 1900 ; i < THIS_YEAR - 13 ; i++)
{
    validyears.options.Add(i);
}

答案 1 :(得分:2)

两者都没有 - 提供一个集中的服务,可以决定使用哪种机制,然后应用程序不关心,你可以自由选择硬编码,滑动窗口或数据库机制。

要扩展,通常我会做这样的事情:

  1. 定义IPopulatableYear接口,该接口有一个AddYear方法,它接受一个int并构造一个合适的ListItem或其他。
  2. MyYearListBox继承自常规ListBox工具IPopulatableYear(适用于winForms或WebForms)
  3. 在DAL或其他任何地方创建静态方法或单例或方法。
  4. 像这样:

    PopulateYears(IPopulatableYear pl) {
        // Very simple implementation - change at will
        for (int lp = 2009 ; lp < 2009 + 10 ; lp++) {
            pl.Add(lp);
        }
    }
    

    PopulateYears(IPopulatableYear pl) {
        // A DB implementation
        SQLDataReader dr = DAL.YearSet() ; // Your choice of mechanism here
        while ( dr.Read() ) {
            pl.Add(dr[YEAR]);
        }
    }
    

    PopulateYears(IPopulatableYear pl) {
        // A DB limits implementation with different ranges defined in database by key - key determined by control itself - IPopulatableYear needs to implement a .YearSetKey property
        SQLDataReader dr = DAL.YearLimits(pl.YearSetKey) ; // Your choice of mechanism here
        for ( int lp = dr[YEAR_MIN] ; lp <= dr[YEAR_MAX] ; lp++ ) {
            pl.Add(lp);
        }
    }
    

    该机制现已集中管理。

    在表单上使用MyYearListBox并在其上调用PopulateYears()。如果您的表单是智能的,他们可以检测所有MyYearListBox个实例并调用它,因此您不再拥有任何新代码 - 只需将其拖动即可。

答案 2 :(得分:2)

看看Enumerable.Range。我认为进行DB调用的效果要比Enumerable.Range低。

答案 3 :(得分:2)

E)使用文本输入框,因为它始终有效。

(当然,请确保将其作为一个数字进行验证。当然,在多年的字典中包括“Y2K”和“第二次世界大战开始”。)

答案 4 :(得分:1)

如何在网络表单中显示年份选择无关紧要。这是一个界面决定。您的服务器不应该信任进来的数据,因此应该对其进行验证。模拟表单提交是微不足道的,因此它的呈现方式并不重要。哎呀,你可以用javascript生成下拉菜单,这样服务器就没有负载了。

您可以使用后端规则进行验证,而不是查找。

答案 5 :(得分:1)

既然你提出了这个问题(并发表了大量的评论),那么你可能会长时间地努力思考这个问题。

对于最终用户来说,很难超越文本框的易用性。是的,你会得到虚假数据,但计算机应该让事情变得更容易,而不是更难。滚动很长一段时间来找到我知道我出生的那一年是一件令人讨厌的事。特别是所有那些想要进入出生年龄的年轻鞭鞭者和老屁,这些都不在我的附近!

但是进一步退缩......你真的需要首先向用户询问他们的出生年份吗? 对您的应用程序很重要吗?你可以通过让其他人处理这个问题来完全避免这个问题吗?比如使用OpenID,Windows Live ID或Facebook Connect?