V
Val P
I am doing a sample control pieced together from pieces on the web... I am
using Visual studio 2008 and I created it as a Ajax web control. The problem
is, at run time, it generates the following code:
....
<div> <span id="AddressBook1"></span>
</div>
<script type="text/javascript">
//<![CDATA[
Sys.Application.initialize();
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
//]]>
....
as you notice, it generated add_init() 4 times, and this leads to an
exception when intializing the second instance. Any idea what I may be doing
wrong? I could very well be getting confused between samples referencing
older and newer versions of ajax, since I'm new at this. I am using VS2008
RTM.
Also, I am unclear about the need for the following lines in AssemblyInfo.cs:
[assembly: WebResource("ytes.controls.AddressBook.js", "text/javascript")]
[assembly: ScriptResource("AddressBook.js", "AddressBook.resources",
"AddressBook.Resource")]
are these in any way redundant and could be causing the issue?
My code is very simple:
JS:
Type.registerNamespace("ytes.controls");
ytes.controls.AddressBook = function(element) {
ytes.controls.AddressBook.initializeBase(this, [element]);
}
ytes.controls.AddressBook.prototype = {
initialize : function(){
ytes.controls.AddressBook.callBaseMethod(this, 'initialize');
},
//Dispose Method
dispose : function()
{
$clearHandlers(this.get_element()) ;
ytes.controls.AddressBook.callBaseMethod(this, 'dispose');
}
}
ytes.controls.AddressBook.registerClass('ytes.controls.AddressBook',
Sys.UI.Control);
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
---
codebehind:
[removed imports]
namespace ytes.controls
{
[ToolboxData("<{0}:AddressBook runat=server> </{0}:AddressBook>")]
public partial class AddressBook : ScriptControl
{
public AddressBook()
: base()
{
//
// TODO: Add constructor logic here
//
}
protected override void OnPreRender(EventArgs e)
{
if (!this.DesignMode)
{
// Make sure ScriptManager exists
ScriptManager mgr = ScriptManager.GetCurrent(Page);
if (mgr == null)
throw new HttpException("A ScriptManager control must
exist on the page."); // TODO: sam exception
// Register as client control.
mgr.RegisterScriptControl(this);
}
base.OnPreRender(e);
}
protected override void Render(HtmlTextWriter writer)
{
if (!this.DesignMode)
ScriptManager.GetCurrent(Page).RegisterScriptDescriptors(this);
base.Render(writer);
}
protected override IEnumerable<ScriptDescriptor>
GetScriptDescriptors()
{
ScriptControlDescriptor descriptor = new
ScriptControlDescriptor("ytes.controls.AddressBook", this.ClientID);
yield return descriptor;
}
// Generate the script reference
protected override IEnumerable<ScriptReference>
GetScriptReferences()
{
yield return new ScriptReference("ytes.controls.AddressBook.js",
this.GetType().Assembly.FullName);
}
}
}
---
markup in hosting page (no code behind):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="WebApplication1._Default" %>
<%@ Register Assembly="ytes.controls.addressbook" Namespace="ytes.controls"
TagPrefix="ytes" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="addressBookScriptMgr" runat="server">
</asp:ScriptManager>
<div> <ytes:AddressBook ID="AddressBook1" runat="server" />
</div>
</form>
</body>
</html>
using Visual studio 2008 and I created it as a Ajax web control. The problem
is, at run time, it generates the following code:
....
<div> <span id="AddressBook1"></span>
</div>
<script type="text/javascript">
//<![CDATA[
Sys.Application.initialize();
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
Sys.Application.add_init(function() {
$create(ytes.controls.AddressBook, null, null, null,
$get("AddressBook1"));
});
//]]>
....
as you notice, it generated add_init() 4 times, and this leads to an
exception when intializing the second instance. Any idea what I may be doing
wrong? I could very well be getting confused between samples referencing
older and newer versions of ajax, since I'm new at this. I am using VS2008
RTM.
Also, I am unclear about the need for the following lines in AssemblyInfo.cs:
[assembly: WebResource("ytes.controls.AddressBook.js", "text/javascript")]
[assembly: ScriptResource("AddressBook.js", "AddressBook.resources",
"AddressBook.Resource")]
are these in any way redundant and could be causing the issue?
My code is very simple:
JS:
Type.registerNamespace("ytes.controls");
ytes.controls.AddressBook = function(element) {
ytes.controls.AddressBook.initializeBase(this, [element]);
}
ytes.controls.AddressBook.prototype = {
initialize : function(){
ytes.controls.AddressBook.callBaseMethod(this, 'initialize');
},
//Dispose Method
dispose : function()
{
$clearHandlers(this.get_element()) ;
ytes.controls.AddressBook.callBaseMethod(this, 'dispose');
}
}
ytes.controls.AddressBook.registerClass('ytes.controls.AddressBook',
Sys.UI.Control);
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
---
codebehind:
[removed imports]
namespace ytes.controls
{
[ToolboxData("<{0}:AddressBook runat=server> </{0}:AddressBook>")]
public partial class AddressBook : ScriptControl
{
public AddressBook()
: base()
{
//
// TODO: Add constructor logic here
//
}
protected override void OnPreRender(EventArgs e)
{
if (!this.DesignMode)
{
// Make sure ScriptManager exists
ScriptManager mgr = ScriptManager.GetCurrent(Page);
if (mgr == null)
throw new HttpException("A ScriptManager control must
exist on the page."); // TODO: sam exception
// Register as client control.
mgr.RegisterScriptControl(this);
}
base.OnPreRender(e);
}
protected override void Render(HtmlTextWriter writer)
{
if (!this.DesignMode)
ScriptManager.GetCurrent(Page).RegisterScriptDescriptors(this);
base.Render(writer);
}
protected override IEnumerable<ScriptDescriptor>
GetScriptDescriptors()
{
ScriptControlDescriptor descriptor = new
ScriptControlDescriptor("ytes.controls.AddressBook", this.ClientID);
yield return descriptor;
}
// Generate the script reference
protected override IEnumerable<ScriptReference>
GetScriptReferences()
{
yield return new ScriptReference("ytes.controls.AddressBook.js",
this.GetType().Assembly.FullName);
}
}
}
---
markup in hosting page (no code behind):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="WebApplication1._Default" %>
<%@ Register Assembly="ytes.controls.addressbook" Namespace="ytes.controls"
TagPrefix="ytes" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="addressBookScriptMgr" runat="server">
</asp:ScriptManager>
<div> <ytes:AddressBook ID="AddressBook1" runat="server" />
</div>
</form>
</body>
</html>