ASP.NET - 如何注册多个JavaScript调用以在PostBack上运行?

时间:2011-02-10 00:37:01

标签: c# javascript asp.net web-user-controls clientscriptmanager

我有一个ASP.NET页面,其中包含两个相同Web用户控件的实例(一个简单的WYSIWYG编辑器)。在提交时,WUC会做一些JavaScript魔术,然后进行正常的回发。

第一个实例似乎正在运行,但第二个实例无法将更改发回服务器(它将恢复为原始版本并发布)。我认为问题是JS只会为第一个WUC开火。我已经从生成的客户端源代码中跟踪了以下代码:

function WebForm_OnSubmit() {
    prepHtml('AddEditPopup1_ctlEditorQuestion_txtEdit','AddEditPopup1_ctlEditorQuestion_divEdit', 'AddEditPopup1_ctlEditorQuestion_divHT' );        
    //snip...
}

问题似乎是应该对prepHtml进行两次调用:一次针对WUC的ctlEditorQuestion实例,一针针对ctlEditorAnswer实例

相反,ctlEditorQuestion只有一个。这两个控件都注册了OnSubmit事件,但其中一个会覆盖另一个。

prepHtml调用是在运行时从WUC的C#代码注册的:

//Page_Load
_onSubmit = String.Format("prepHtml('{0}','{1}', '{2}' );", 
                txtEdit.ClientID, divEdit.ClientID, divHT.ClientID);

//OnPreRender
Page.ClientScript.RegisterOnSubmitStatement(this.GetType(), "get-html", _onSubmit);

我应该指出,我自己并没有编写这个控件,而且我以前从未见过这种OnSubmit JS代码的运行时注册。 Page.ClientScript.RegisterOnSubmitStatement对我来说是全新的。

我需要注册两个prepHtml调用,以便它们按顺序运行。这可能吗?我愿意接受Page.ClientScript.RegisterOnSubmitStatement的替代方案,只要代码仍然在提交时被解雇。

1 个答案:

答案 0 :(得分:1)

如果没有将控件紧密耦合到页面,这应该可以做你想要的。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        string onSubmit = string.Format("prepHtml('{0}','{1}', '{2}';",
            txtEdit.ClientID,
            divEdit.ClientID,
            divHT.ClientID);

        Page.ClientScript.RegisterOnSubmitStatement(this.GetType(), 
            this.Id + "_getHtml", onSubmit);
    }
}

密钥(正如我在评论中提到的)是唯一的名称。请注意,我在脚本名称中使用“this.ID”。 ID属性保证在页面中是唯一的,因此它将是一个很好的候选者。