使用JQuery的ASP.NET动态用户控件

时间:2011-03-15 00:23:37

标签: asp.net jquery c#-3.0

好吧......这是一个复杂的问题,所以希望我能正确解释。

我有一个用户控件,我通过一个方法在我的page_load事件中动态加载(见下文)。用户控件包含gridview和标签。 信息与如何解决当数据源为空时不会呈现的网格视图的便捷功能有关。在我的用户控件中,我添加了一些隐藏的行,以便网格将呈现,用户只能看到标题(如果情况需要它)。

nomControl是父页面上的asp:Panel,它将保存用户控件。 dsRefinedProductsNomInfo是强类型数据集。

private void LoadCycleControls()
    {
        var dsRefinedProductsNomInfo = Session[REFINED_PRODUCT_NOMINATION_INFO] as RefinedProductsNomInfo;

        if (dsRefinedProductsNomInfo == null)
        {
            return;
        }

        int permittedCycles = dsRefinedProductsNomInfo.NOS_MONTH.Count == 0 ? 0: dsRefinedProductsNomInfo.NOS_MONTH[0].PERMITTED_CYCLES;

        for (int cycle = 1; cycle <= permittedCycles; cycle++ )
        {
            var control = LoadControl("~/CustomControl/RefinedProductNominationCycleControl.ascx");
            nomContent.Controls.Add(control);

            var nomControl = control as RefinedProductNominationCycleControl;

            if (nomControl == null)
            {
                return;
            }

            nomControl.CycleNumber = cycle;
            nomControl.ID = "control_" + cycle;
            nomControl.CycleTitle = "Cycle " + cycle;

            nomControl.GridDataSource = dsRefinedProductsNomInfo.REFINED_PRODUCT_NOS_CYCLE_INFO;
        }
    }

现在,当用户向网格添加行时,他们会点击加号按钮。在按钮javascript click事件中,我对页面方法进行了ajax调用。

 var options = {
    type: "POST",
    url: "RefinedProductNomination.aspx/AddNomCycleLineItem",
    data: "{'id':'" + tableRow.attr("id") + "',\
            'isPlug':'" + isPlug + "',\
            'sequenceNbr':'" + sequenceNbr + "',\
            'receiptLocationId':'" + receiptLocationId + "',\
            'materialTypeId':'" + materialId + "',\
            'shipperId':'" + shipperId + "',\
            'tankId':'" + tankId + "',\
            'deliveryLocationId':'" + deliveryLocationId + "',\
            'volume':'" + volume + "',\
            'cycle':'" + cycle + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(response) {
        if (response.d != "") {
            if (response.d == "-1000") {

                var messageContainer = tableRow.parents("div").siblings("div #messageSummary");
                messageContainer.empty()
                var message = $("<span></span>").append("There has been an issue accepting the row please try again.");

                messageContainer.append(message);
                message.fadeOut(10000, "linear");

            }
            else {
                ConvertToReadOnlyRow(tableRow, response.d);
            }
        }
    }
};
//Call the PageMethods
$.ajax(options); 

页面方法然后从缓存中检索数据集并添加用户创建的新行。这一切都很好,我可以通过asp:按钮保存到数据库并处理它的点击事件。

我的问题是在用户点击保存按钮并且所有内容都呈现后,我的网格显示了我添加的行,以确保只显示标题。在我的保存按钮单击事件中,我将删除这些添加的行,以便它们不会保留,然后保存,然后在加载用户控件后再次添加。最初这似乎是处理这个问题的合适场所,但在弄清楚事件的顺序之后,看起来我错了。

所以我的问题。任何人都可以建议我应该如何处理我的事件,以便我的渲染网格是最新的,而不是显示这些隐藏的行。我有一种感觉,我只是在错误的地方/顺序做事,但这是我在asp.net池深处的第一次真正的游泳。如果有任何其他信息有用,请告诉我。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我觉得我已经解决了自己的问题。基本上我所做的就是:

<强> 1。在父page_load上,我重新加载控件,以便它们显示在屏幕上。

protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            LoadCycleControls();
            return;
        }

        RetrieveParameters();
        LoadRefinedNominationInfo();
        LoadLookupLists();
        LoadCycleControls();
    }

<强> 2。在控制page_load上,我检查IsPostBack。如果这是真的我就回来了。

protected void Page_Load(object sender, EventArgs e)
    {
        if(IsPostBack)
        {
            return;
        }

        BindData();
        cycleNumber.Value = _cycleNumber.ToString();
    }

第3。在父保存按钮单击,这导致回发,我做我正常的保存逻辑。在完成之后,我遍历我创建的所有控件,将其数据源设置为更新的数据集。在我的控制中,我暴露了一个名为BindData()的方法,然后我调用它。

 protected void BtnSaveClick(object sender, EventArgs e)
    {
        SaveRefinedProductNosInfo();

        var dataSet = RefinedProductsNomInfoCache;

        if (dataSet == null)
        {
            return;
        }

        foreach (var nomControl in nomContent.Controls.OfType<RefinedProductNominationCycleControl>())
        {
            nomControl.GridDataSource = dataSet.REFINED_PRODUCT_NOS_CYCLE_INFO;
            nomControl.BindData();
        }
    }

现在即使我稍微有点新意,感觉有点脏,这可能意味着我还没有做得很好,所以如果有人真的知道我这样做是否正确或者不关心评论会很好: )