C#Asp.net自定义控件的Javascript闭包
我有一个自定义Asp.net控件作为C#Asp.net自定义控件的Javascript闭包,c#,javascript,asp.net,controls,closures,C#,Javascript,Asp.net,Controls,Closures,我有一个自定义Asp.net控件作为 public class ImageControl : Panel { private RadAsyncUpload AsyncUpload; } 页面上的多个ImageControl应该使用JS对象的本地实例,因此我将它们包装在object中(闭包): JS> ASP.NET> protected override void Render(HtmlTextWriter writer) { Page.ClientScript.Reg
public class ImageControl : Panel
{
private RadAsyncUpload AsyncUpload;
}
页面上的多个ImageControl应该使用JS对象的本地实例,因此我将它们包装在object中(闭包):
JS>
ASP.NET>
protected override void Render(HtmlTextWriter writer)
{
Page.ClientScript.RegisterClientScriptResource(_TYPE, JS.ImageControl);
writer.Write(@"
<script type=""text/javascript"" id=""" + ClientID + @"ScriptHost"">
(function( ) {
var onLoad = function( ) {
window." + ID + @" = new MyControls.ImageControl();
};
if (window.addEventListener) {
window.addEventListener('load', onLoad, false);
}
else if (window.attachEvent) {
window.attachEvent('onload', onLoad);
}
})( );
</script>
");
base.Render(writer);
}
在从ScriptControl继承的“AJAX服务器控制项目”自定义类中,我仍然可以使用高级包装“面板”吗
任何建议都将不胜感激。步骤1。
正确添加IScriptControl接口,如下所示:[1]
现在JS部分正在加载
第二步。
将var传递给JS>
this.AsyncUpload=null;//在MyControls.ImageControl=function(){}
在代码隐藏中设置它。。在GetScriptDescriptors()中
第三步。
在prototype中创建代理:
this._FileSelected = Function.createDelegate(this, this.FileSelected);
并在DOM就绪时添加并执行它:
this.addLoadEvent(this._FileSelected);
在哪里
关键是将EventHandler分配给子控件应该在初始化之后完成
==================================CS===
public class ServerControl1 : Panel, IScriptControl
{
private RadAsyncUpload AsyncUpload;
public ServerControl1()
{
ID = Guid.NewGuid().ToString();
AsyncUpload = new RadAsyncUpload();
}
protected override void OnInit(EventArgs e)
{
Page.ClientScript.RegisterClientScriptResource(GetType(), "ImageControl.jquery.min.js");
Controls.Add(AsyncUpload);
base.OnInit(e);
}
protected override void OnPreRender(EventArgs e)
{
var manager = ScriptManager.GetCurrent(Page);
if (manager == null)
{
throw new InvalidOperationException("A ScriptManager is required on the page.");
}
manager.RegisterScriptControl(this);
base.OnPreRender(e);
}
protected override void Render(HtmlTextWriter writer)
{
if (!DesignMode)
ScriptManager.GetCurrent(Page).RegisterScriptDescriptors(this);
base.Render(writer);
}
public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
var descriptor = new ScriptControlDescriptor("ImageControl.ClientControl1", this.ClientID);
descriptor.AddProperty("AsyncUpload", this.AsyncUpload.ClientID);
yield return descriptor;
}
public IEnumerable<ScriptReference> GetScriptReferences()
{
yield return new ScriptReference("ImageControl.ClientControl1.js", GetType().Assembly.FullName);
}
}
结束。好的。第一步是正确地添加IScriptControl接口,如图所示:现在JS部件正在加载,但我仍然需要弄清楚如何将处理程序添加到AsyncUploadsecond步骤是将vars传递到JS>this.idx=null;this.AsyncUpload=null;并将它们设置为代码隐藏。。descriptor.AddProperty(“idx”,this.ClientID);descriptor.AddProperty(“AsyncUpload”,this.AsyncUpload.ClientID);
this._FileSelected = Function.createDelegate(this, this.FileSelected);
this.addLoadEvent(this._FileSelected);
addLoadEvent: function(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
public class ServerControl1 : Panel, IScriptControl
{
private RadAsyncUpload AsyncUpload;
public ServerControl1()
{
ID = Guid.NewGuid().ToString();
AsyncUpload = new RadAsyncUpload();
}
protected override void OnInit(EventArgs e)
{
Page.ClientScript.RegisterClientScriptResource(GetType(), "ImageControl.jquery.min.js");
Controls.Add(AsyncUpload);
base.OnInit(e);
}
protected override void OnPreRender(EventArgs e)
{
var manager = ScriptManager.GetCurrent(Page);
if (manager == null)
{
throw new InvalidOperationException("A ScriptManager is required on the page.");
}
manager.RegisterScriptControl(this);
base.OnPreRender(e);
}
protected override void Render(HtmlTextWriter writer)
{
if (!DesignMode)
ScriptManager.GetCurrent(Page).RegisterScriptDescriptors(this);
base.Render(writer);
}
public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
var descriptor = new ScriptControlDescriptor("ImageControl.ClientControl1", this.ClientID);
descriptor.AddProperty("AsyncUpload", this.AsyncUpload.ClientID);
yield return descriptor;
}
public IEnumerable<ScriptReference> GetScriptReferences()
{
yield return new ScriptReference("ImageControl.ClientControl1.js", GetType().Assembly.FullName);
}
}
Type.registerNamespace("ImageControl");
ImageControl.ClientControl1 = function (element) {
ImageControl.ClientControl1.initializeBase(this, [element]);
this.AsyncUpload = null;
}
ImageControl.ClientControl1.prototype = {
initialize: function () {
ImageControl.ClientControl1.callBaseMethod(this, 'initialize');
this._Added = Function.createDelegate(this, this.Added);
this._initAsyncClientFunctions = Function.createDelegate(this, this.initAsyncClientFunctions);
this.addLoadEvent(this._initAsyncClientFunctions);
},
dispose: function () {
ImageControl.ClientControl1.callBaseMethod(this, 'dispose');
},
addLoadEvent: function(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
},
initAsyncClientFunctions: function()
{
var asyncUpload = $find(this.AsyncUpload);
asyncUpload.add_added(this._Added);
},
Added: function () {
alert('added ' + this.AsyncUpload);
},
};
ImageControl.ClientControl1.registerClass('ImageControl.ClientControl1', Sys.UI.Control);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();