[英]Javascript Closure for C# Asp.net Custom Control
I have a custom Asp.net control as 我有一个自定义的Asp.net控件
public class ImageControl : Panel
{
private RadAsyncUpload AsyncUpload;
}
Multiple ImageControls on the page should use local instances of JS objects so I wrap them in object (closure): 页面上的多个ImageControl应该使用JS对象的本地实例,因此我将它们包装在object中(关闭):
JS> JS>
Type.registerNamespace("MyControls.ImageControl");
MyControls.ImageControl = function () {
this._filesUploaded = 0;
this._maxFileCount = 1;
};
MyControls.ImageControl.prototype = {
inc_filesUploaded: function () {
this._filesUploaded++;
},
FileSelected: function (sender, args) {
inc_filesUploaded();
}
};
MyControls.ImageControl.registerClass('MyControls.ImageControl');
ASP.NET> 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);
}
www.asp.net/AJAX/Documentation/Live/tutorials/CreatingCustomClientControlsTutorial.aspx www.asp.net/AJAX/Documentation/Live/tutorials/CreatingCustomClientControlsTutorial.aspx
stackoverflow.com/questions/6309947/javascript-closure-advantages stackoverflow.com/questions/6309947/javascript-closure-advantages
http://www.codeproject.com/Articles/55414/From-Simple-JavaScript-Classes-to-ASP-NET-AJAX-Con http://www.codeproject.com/Articles/55414/From-Simple-JavaScript-Classes-to-ASP-NET-AJAX-Con
http://www.netfxharmonics.com/2008/11/Creating-JavaScript-Components-and-ASPNET-Controls http://www.netfxharmonics.com/2008/11/Creating-JavaScript-Components-and-ASPNET-Controls
?: I get error MyControls.ImageControl is not a constructor ?: Will it be possible to assign these "packed" functions as event handlers as ?:我收到错误MyControls.ImageControl不是构造函数?:可以将这些“打包的”函数分配为事件处理程序吗?
AsyncUpload.OnClientFileSelected = "FileSelected";
In "AJAX Server Control Project" Custom class gets inherited from ScriptControl, can I still use high-level wrap "Panel" instead? 在“ AJAX服务器控件项目”中,自定义类是从ScriptControl继承的,我是否仍可以使用高级包装“面板”来代替?
Any advise would be appreciated. 任何建议将不胜感激。
step 1. properly add IScriptControl Interface as shown here: [1] http://vincexu.blogspot.com/2010/02/aspnet-ajax-scriptcontrol-tutorial.html Now JS part getting loaded. 步骤1.正确添加IScriptControl接口,如下所示:[1] http://vincexu.blogspot.com/2010/02/aspnet-ajax-scriptcontrol-tutorial.html现在正在加载JS部分。
step 2. passing var to JS> 步骤2.将var传递给JS>
this.AsyncUpload = null; // in MyControls.ImageControl = function () { }
setting it in code-behind.. in GetScriptDescriptors() 在GetScriptDescriptors()中的代码隐藏中设置它。
descriptor.AddProperty("AsyncUpload", this.AsyncUpload.ClientID);
step 3. create a delegate in prototype: 步骤3.在原型中创建一个委托:
this._FileSelected = Function.createDelegate(this, this.FileSelected);
and add execute it when DOM is ready: 并在DOM准备就绪时添加执行它:
this.addLoadEvent(this._FileSelected);
where 哪里
addLoadEvent: function(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
The point is assigning EventHandlers to child controls should be done after they are initialized. 关键是将EventHandlers分配给子控件应该在它们初始化之后完成。
======================CS=== ===================== 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);
}
}
======================JS=== ====================== JS ===
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();
The End. 结束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.