我有一个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
的替代方案,只要代码仍然在提交时被解雇。
答案 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属性保证在页面中是唯一的,因此它将是一个很好的候选者。