0

嗨,我想在看到不同的例子感到非常困惑之后,我需要一些澄清。

我正在创建一个带有 3 个下拉框的自定义日期控件,有点像你在 Facebook 的登录页面上看到的。

我的控件在其客户端功能方面工作正常,当尝试检索值服务器端时出现问题。

似乎当我通过 JavaScript 填充下拉列表时,当我转到服务器端时,它完全不知道所选值。

在阅读之后,我决定将子控件移至 OnInit 函数,在此我调用注册启动脚本以通过 JavaScript 填充下拉列表。

从那以后,我不得不更改它以添加服务器端的值。到目前为止,它看起来像这样。

  protected override void OnInit(EventArgs e)
    {

        /* create controls and add some JavaScript stuff here*/

        /*Problem below*/

        if (!Page.IsPostBack)
        {
            /* These seemably have to be here inspite the fact we can populate with java, issue: on postback selected values are lost. */
            for (int i = 1; i <= 31; i++)
            {
                ddlDay.Items.Add(new ListItem(i.ToString()));
            }

            for (int i = 1; i <= 12; i++)
            {
                ddlMonth.Items.Add(new ListItem(i.ToString()));
            }

            for (int i = 1901; i <= 2012; i++)
            {
                ddlYear.Items.Add(new ListItem(i.ToString()));
            }
        }

        ScriptManager.RegisterStartupScript(this, Page.GetType(), Guid.NewGuid().ToString(), "<script type='text/javascript'>DateControlRender(document.getElementById('" + this.ClientID + "'));</script>", false);

        base.OnInit(e);
    }

无论如何我可以解决这个问题吗?我主要担心的是这会大大增加页面大小。

先感谢您。

此致

戴夫

4

2 回答 2

0

如果这是一个自定义控件,我猜你ddls是动态创建的。在这种情况下,请记住您必须在“init 事件”中创建它们。如果没有,viewstate将无法正常工作

于 2012-08-01T15:29:38.103 回答
0

底线...您不能使用 javascript 填充下拉列表并让 ASP.NET 管道能够重新创建控件的结构,以便有一个 SelectedItem/SelectedValue。为了让 ASP.NET 管道能够捕获用户选择的值并将其分配给控件,必须在 Init 阶段结束时创建并填充控件。在该阶段之后应用选择,但控件及其值必须与发送给客户端时的方式相同。

所以你有几个选择......完全在服务器端创建控件并放弃javascript。或者您可以使用 javascript,然后从Form变量中获取值。即使控件不是 ASP.NET 页面的一部分,您仍然可以访问来自客户端的表单变量中所有 HTML 输入元素的发布值。

于 2012-08-01T17:17:33.710 回答