1

我有一个ASP.NET页面与两个相同的Web用户控件实例(一个简单的所见即所得的编辑器)。提交后,WUC会做一些JavaScript魔术,然后继续正常的回发。ASP.NET - 如何注册多个JavaScript调用以在PostBack上运行?

第一个实例似乎正在工作,但第二个实例未能将更改发回到服务器(它会恢复到原始状态,并发布该更改)。我相信问题在于JS只为第一个WUC发火。我追踪,为下面的代码,从生成的客户端源:

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

的问题似乎是,应该有调用prepHtml:一个用于世维会的ctlEditorQuestion情况下,另一个用于ctlEditorAnswer实例。

取而代之的是ctlEditorQuestion只有一个。两个控件都注册OnSubmit事件,但其中一个覆盖另一个。

prepHtml呼叫从WUCS' 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

@Chris Gessler:`prepHtml`将innerHTML从可编辑div复制到textarea,然后发回。问题是只有一次调用`prepHtml`时,应该有两个。第二个代码块是应该在那里的,但事实并非如此。 – 2011-02-10 01:04:01

回答

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属性保证在页面内是唯一的,所以它将是一个很好的候选人。

+0

我无法同时访问两组客户端ID;他们在两个独立的WUC中,每个WUC都试图在相同的地方注册代码。我应该指定C#代码位于WUC代码隐藏中,而不是客户端页面。 – 2011-02-10 01:06:44