可以在按钮的单击事件上呈现用户控件吗?

时间:2016-06-14 08:07:05

标签: javascript c# jquery html asp.net

我创建了一个用户控件,它实际上为应用程序表单创建了一个空对话框。我想在按钮的click事件上呈现此用户控件(就像我们渲染部分视图一样)。我有一个包含按钮的.aspx页面。单击按钮时,将打开创建对话框的用户控件。下面是为在用户控件中打开对话框而编写的jquery代码:

Jquery的

createAliasPopUpForm: function (rowNumberId) {
    // debugger;
    var self = this;
    var dat = $("input[id*='hdnAliasRecordmetaData']").val();
    self.metaDataColumns = JSON.parse(dat);
    //debugger;   
    // now bind update data to pop up
    if (self.metaDataColumns.length > 0) {

        if (rowNumberId != 'undefined' && rowNumberId != null) {
            self.rowNumber = rowNumberId;
            // fill alias record to meta data
            var listdata = $("input[id*='hdnAliasRecordList']").val();
            var aliasList = JSON.parse(listdata);
            if (aliasList.Rows.length > 0) {
                $.each(aliasList.Rows, function (i, val) {
                    if (this.RowNumber == rowNumberId) {
                        self.fillAliasRecord(self.metaDataColumns, this.Columns);
                        return false;
                    }
                });
            }

        }
        else {
            // right now cloumn list has MDM record value so need to clear that value only
            $.each(self.metaDataColumns, function (i, val) {
                this.Value = '';
            });
        }



        // sort array
        //self.metaDataColumns.sort(common.dynamicSortMultiple("GroupOrder", "MetadataId"));
        self.metaDataColumns.sort(common.dynamicSortMultiple("GroupOrder", "ColumnNumber"));
        self.createPopupHtml(self.metaDataColumns, rowNumberId);
        self.init();

        $('#popUpHeader').find('h4').remove();
        $('#popUpHeader').append('  <h4 class="modal-title" >Alias Record</h4>');
        $("#updateConfirmPopUp").dialog({
            autoOpen: true,
            width: 600,
            resizable: false,
            draggable: false,
            modal: true,
            show: { effect: 'blind' }
        });
    }



},

用户控件

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AddAlias.ascx.cs" Inherits="OCM.Phoenix.WebToolsFramework.Server.Modules.MDMAdmin.AddAlias" %>
<script language="javascript" type="text/javascript" src='<%= ResolveClientUrl("~/scripts/jquery-1.4.2.min.js") %>'></script>
<script language="javascript" src="../Scripts/jquery.js" type="text/javascript"></script>
<script language="javascript" src="../Scripts/jquery-ui.js" type="text/javascript"></script>
<script language="javascript" src="../Scripts/bootstrap.min.js" type="text/javascript"></script>
<script language="javascript" src="../Scripts/Common.js" type="text/javascript"></script>
<script language="javascript" src="../Scripts/AdminEdit.js" type="text/javascript"></script>

<asp:HiddenField ID="hdnAliasRecordmetaData" runat="server" />
<asp:HiddenField ID="hdnAliasRecordList" runat="server" />
<script>
$(function () {
    adminEditForm.createAliasPopUpForm();
});
</script>

文件后面的代码只包含加载事件

aspx页面

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddAliasPage.aspx.cs" Inherits="Modules_MDMDataHub_AddAliasPage" %>

<%@ Register Src="UserControls/AddAlias.ascx" TagPrefix="uc" TagName="alias" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<script src="Scripts/jquery.js"></script>
<script src="Scripts/jquery-ui.js"></script>
<script src="Scripts/AdminEdit.js"></script>

<body>
    <form id="form1" runat="server">
        <div>
            <uc:alias ID="alias" runat="server" />
            <br />

            <asp:button ID="btn1" OnClick="btn1_Click" runat="server">    </asp:button>

        </div>
    </form>
</body>
</html>

虽然,我已经创建了按钮的click事件,它调用下面的函数来呈现用户控件的html。但由于hdnmetadatavalue必须位于表单标记内,因此它不能正常工作,因为它一直给我一个错误。我做到了但仍然得到了错误。我在这里做错了吗?请帮忙

private string RenderControl()
{
    var sb = new System.Text.StringBuilder();
    using (var stWriter = new System.IO.StringWriter(sb))
    using (var htmlWriter = new HtmlTextWriter(stWriter))
    {
        var p = new Page();

        var ctrl = (AddAlias)p.LoadControl("~/Modules/MDMDataHub/UserControls/AddAlias.ascx");
        ctrl.Visible = true;

        // do your own init logic if needed

        p.Controls.Add(ctrl);
        ctrl.RenderControl(htmlWriter);
        return sb.ToString();
    }
}

1 个答案:

答案 0 :(得分:0)

通过审核您的代码:

var ctrl = (AddAlias)p.LoadControl("~/Modules/MDMDataHub/UserControls/AddAlias.ascx");
// ... other lines
ctrl.RenderControl(htmlWriter);

我假设您正在尝试将用户控制的RenderControl方法调用到HTML呈现,如果用户控件在runat="server"定义的表单标记之外呈现,页面将引发表单标记异常。

在页面代码后面使用Page.VerifyRenderingInServerForm方法,以确保正确呈现所有用户控件:

public override void VerifyRenderingInServerForm(Control control) {
    // nothing to override here
}

public override boolean EnableEventValidation {
    get { return false; }
}

参考:UserControl's RenderControl is asking for a form tag in (C# .NET)