1

我知道这似乎不切实际,但我真的更喜欢这样做,因为我正在重新设计这个 WebForms 页面以满足紧急的、最后一刻的业务需求。

我有一个自定义用户控件。在这个用户控件中是一个 Javascript 块,其中包含连接到各种控件onclickonchange事件的函数。之前,控件的.Visible属性是True,所以它的 HTML 和 Javascript 会在页面上呈现。

现在我需要将控件的.Visible属性设置为false并在其周围包裹一个 UpdatePanel。这样做可以防止控件的 HTML 在初始页面加载期间呈现。要显示控件的内容,用户必须单击一个按钮,该按钮会点击一个服务器端方法,该方法将控件的.Visible属性设置为true. 由于它现在位于 UpdatePanel 中,因此该控件以一种 Ajaxy 方式出现在页面上。但是,控件中的 Javascript 似乎不可访问,因此子控件onclickonchange事件都不起作用,因为它们的关联 Javascript 函数是undefined.

为了简洁起见,由于过于复杂而无法进入的原因,我不想使用的解决方案:

  • JSON/AJAX(在这么短的时间内涉及太多的重构)
  • CSS display:none/visibility:visible(我需要尽可能多地保留服务器端功能以最小化重新架构)
  • 将 Javascript 放在父页面或 .js 文件中(我会认为这是最后的手段,但我使用 . 引用服务器控件<#%=ControlId.ClientID %>。如果 Javascript 不包含在 UserControl 中并且我不想将控件设置ClientIdModestatic.)

我真的很想找到一种方法将 Javascript 保留在我的 UserControl 中,这样当 UpdatePanel 使用 UpdatePanel 将控件的.Visible属性设置为时,客户端可以访问它true

4

1 回答 1

2

最简单的方法是将javascript作为一个大字符串包含在后面的代码中并在加载时注册它:

        protected void Page_Load(object sender, EventArgs e)
        {
            string javasriptToRegister = @"
  function MyAwesomeJavaScriptFunction() {
     alert( document.getElementById('" + this.txtCatName.ClientID + @"').value );
  }";
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true);
        }

这绝不是完成它的最干净的方法,但它会起作用。

如果你想让它更简洁一点,你可能想要包含一个外部 javascript 文件,其中包含一个单例或一个代表你的控件的原型对象(取决于你的用例)。然后,您可以在包含的较小脚本中将对象/单例的属性设置为您的客户端 ID,就像我们在上面所做的那样。例如:

Javascript:

function MyControlScriptModel() {
  this.txtCatNameClientId = '';
  this.othercontainedValue = 0;
  this.anothercontainedValue = 0;
}

MyControlScriptModel.prototype.DoSomethingWithCatName = function () {
  alert( document.getElementById( this.txtCatNameClientId ).value );
}

后面的代码:

        protected void Page_Load(object sender, EventArgs e)
        {
            string javasriptToRegister = string.Format(@"var obj = new MyControlScriptModel();
                                                         obj.txtCatNameClientId = '{0}';", this.txtCatNameClientId);
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true);
        }
于 2012-09-14T17:00:37.930 回答