C# 在页面中循环并添加下拉项,而不是代码隐藏?

C# 在页面中循环并添加下拉项,而不是代码隐藏?,c#,asp.net,C#,Asp.net,我想知道是否可以在页面中添加下拉项而不是代码隐藏 假设我有一个下拉框,我想显示1900年~当前年份 <asp:DropDownList ID="ddlYear" runat="server" CssClass="text"> <% int currentYear = DateTime.Now.Year; for (int i = 1900; i < currentYear; i++) { %>

我想知道是否可以在页面中添加下拉项而不是代码隐藏

假设我有一个下拉框,我想显示1900年~当前年份

<asp:DropDownList ID="ddlYear" runat="server" CssClass="text">
    <% 
        int currentYear = DateTime.Now.Year;
        for (int i = 1900; i < currentYear; i++)
        {
    %>
        <asp:ListItem><%=i %></asp:ListItem>
    <%
        }
    %>
</asp:DropDownList>

有可能做那样的事吗

因为当我尝试像上面那样做时,它会给我:

警告1 C:\SandBox\MyWebApplication1\MyWebApplication1\Default.aspx: ASP.NET运行时错误:此版本不支持代码块 上下文C:\SandBox\MyWebApplication1\MyWebApplication1\Default.aspx 35 1 MyWebApplication1

编辑:我也试过:

<asp:DropDownList ID="DropDownList1" runat="server">

</asp:DropDownList>

<% 
    int currentYear = DateTime.Now.Year;

    if (currentYear <= 1933)
    {
        currentYear = 2012;
    }
    for (int i = 1933; i < currentYear; i++)
    {
        DropDownList1.Items.Add(new ListItem(i.ToString(), i.ToString()));
    }
%>


我不相信是这样。您可以在页面中使用脚本块,而不是在代码隐藏中,但它们的编码方式与代码隐藏的编码方式相同(即方法块,将下拉列表作为对象引用,并调用add方法等),因此您在页面中这样做并没有真正获得任何好处。

我不认为是这样。您可以在页面中而不是在代码隐藏中使用脚本块,但它们的编码方式与代码隐藏相同(即方法块,将下拉菜单作为对象引用,并调用add方法,等等)因此,在页面中这样做并没有真正获得任何好处。

我有一个例子,我们用ASP.NET 2.0编写了一个项目,但我们不再有进行更改的源代码。我们需要修改下拉列表中显示的状态。旧代码中有美国州和加拿大省,我们只需要显示州。下拉列表绑定到代码中的数据源,因此我们清除这些项,然后添加所有项

<%
if(!IsPostBack)
{
    st.Items.Clear();
    st.Items.Add(new ListItem("State", "")); //Add an empty item at the top for default value        
    string usStates = "AA,AE,AK,AL,AP,AR,AS,AZ,CA,CO,CT,DC,DE,FL,FM,GA,GU,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MH,MI,MN,MO,MP,MS,MT,NC,ND,NE,NH,NJ,NM,NV,NY,OH,OK,OR,PA,PR,PW,RI,SC,SD,TN,TX,UT,VA,VI,VT,WA,WI,WV,WY";
    foreach (string state in usStates.Split(','))
    {
        st.Items.Add(new ListItem(state, state));
    }
}
%>
<select name="st" class="col" id="st" alt="select" runat="server">

区别在于我在控件之前进行了修改,而我不得不这样做的原因是在控件呈现到页面后更改下拉列表之后出现的任何脚本


尝试将代码移到下拉列表上方。我们的代码检查是否有回发,以便保留以前输入的任何值。在每次加载页面时都重新加载列表是没有意义的,只是第一次加载而已。

我有一个例子,我们用ASP.NET 2.0编写了一个项目,但我们不再有进行更改的源代码。我们需要修改下拉列表中显示的状态。旧代码中有美国州和加拿大省,我们只需要显示州。下拉列表绑定到代码中的数据源,因此我们清除这些项,然后添加所有项

<%
if(!IsPostBack)
{
    st.Items.Clear();
    st.Items.Add(new ListItem("State", "")); //Add an empty item at the top for default value        
    string usStates = "AA,AE,AK,AL,AP,AR,AS,AZ,CA,CO,CT,DC,DE,FL,FM,GA,GU,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MH,MI,MN,MO,MP,MS,MT,NC,ND,NE,NH,NJ,NM,NV,NY,OH,OK,OR,PA,PR,PW,RI,SC,SD,TN,TX,UT,VA,VI,VT,WA,WI,WV,WY";
    foreach (string state in usStates.Split(','))
    {
        st.Items.Add(new ListItem(state, state));
    }
}
%>
<select name="st" class="col" id="st" alt="select" runat="server">

区别在于我在控件之前进行了修改,而我不得不这样做的原因是在控件呈现到页面后更改下拉列表之后出现的任何脚本



尝试将代码移到下拉列表上方。我们的代码检查是否有回发,以便保留以前输入的任何值。在每次页面加载时都重新加载列表是没有意义的,只是第一次加载。

ASP.NET不是有一个用于此目的的Repeater控件吗?我刚刚签出了Repeater控件,但似乎有点过头了?我只需要添加DropDownItem…ASP.NET不是有一个用于此目的的Repeater控件吗?我刚签出Repeater控件,但似乎有点过头了?我只需要添加DropDownItem…我只想将UI内容与代码背面分离,因此代码背面将包含逻辑…我认为您所做的是逻辑。无论哪种方式,如果您真的希望这类内容与其他逻辑分离,那么您可以在codebehind类中使用不同的区域,或者使用分部类为您的代码behind创建两个不同的文件。更好的方法可能是创建您自己的自定义用户控件,它是一个下拉列表,并在其中执行所有逻辑就用这个控制。没有真正错误的答案,但有些答案可能更有意义,并且遵循更结构化的方法。顺便说一句,这是代码背后的问题,而不是代码背后的问题。除非你是感冒了。@Jonners我确实感冒了,但即使我不笑,我也会打字,谢谢,我会改正的。我只是想把UI内容和代码界面分开,这样代码界面就会包含逻辑……我认为你所做的就是逻辑。无论哪种方式,如果您真的希望这类内容与其他逻辑分离,那么您可以在codebehind类中使用不同的区域,或者使用分部类为您的代码behind创建两个不同的文件。更好的方法可能是创建您自己的自定义用户控件,它是一个下拉列表,并在其中执行所有逻辑就用这个控制。没有真正错误的答案,但有些答案可能更有意义,并且遵循更结构化的方法。顺便说一句,这是代码背后的问题,而不是代码背后的问题。除非你是感冒了。@Jonners我确实感冒了,但即使我不笑,我也会打字,谢谢,我会改正的。你的代码中有什么东西改变了下拉列表中的项目吗?它工作的原因是,您已将代码从控件(和项)呈现之后移动到控件(和项)呈现到页面之前。我按照您所说的将添加项脚本移动到控件之前。但是当我点击一个按钮进行回发时,它就消失了。但是如果我删除if(!IsPostBack)并让它在每次回发时再次添加,它就会工作……奇怪。。。。无论如何,谢谢。您的代码中是否有更改下拉列表中项目的内容?它工作的原因是,您已将代码从控件(和项)呈现之后移动到控件(和项)呈现到页面之前。我按照您所说的将添加项脚本移动到控件之前。但是当我点击一个按钮进行回发时,它就消失了。但是如果我删除if(!IsPostBack)并让它在每次回发时再次添加,它就会工作……奇怪。。。。无论如何,谢谢你。