Use Javascript objects like you do it in C#
While developing websites (intranet applications) I had to save a lot of information on the client or for a user. First, I used cookies to save information. I noticed that I can only save up to 20 cookies with a lenght of about 192 chars I searched for a new way of saving cookies. While I am only developing intranet applications for the Internet Explorer, I decided to use a webservice to save cookies.
[WebMethod(Description="")]
{
MS.Security.Authentication auth = new MS.Security.Authentication(AuthenticationTicket);
int UserID = auth.UserID;
int DataSetID = auth.DataSetID;
return ControlSettings.SaveSettingsObject(UserID, DataSetID, Name, Value);
}
[WebMethod(Description="")]
{
MS.Security.Authentication auth = new MS.Security.Authentication(AuthenticationTicket);
int UserID = auth.UserID;
int DataSetID = auth.DataSetID;
return ControlSettings.GetSettingsObject(UserID, DataSetID, Name);
}
Now, I took a look at my information to save. It would be nice to have objects in Javascript, allow to save these objects to the database for each user, and retreive a object again. I wrote a simple serializer/deserializer that will take my Javascript object, convert this object to a xml stream and save it as a string.
Here is my Javascript code (note: the script is not published complete here, contact me if you want to have my current version):
function
Serializer(){
this._xml = new ActiveXObject("Microsoft.XMLDOM");
this._xml.loadXML("<Serializer/>");
this.serialize = Serializer_serialize;
this.deserialize = Serializer_deserializeXml;
}
function
Serializer_deserialize(node){
var o = new Object();
for(var i=0; i<node.childNodes.length; i++)
{
if(node.childNodes[i].tagName == "string")
{
return node.childNodes[i].text;
}
else if(node.childNodes[i].tagName == "number")
{
return node.childNodes[i].text;
}
else if(node.childNodes[i].tagName == "boolean")
{
return node.childNodes[i].text == "true";
}
else if(node.childNodes[i].tagName == "dateTime")
{
var d = new Date(parseInt(node.childNodes[i].text));
d.setHours(d.getHours() + d.getTimezoneOffset() / 60);
return d;
}
// else all other objects
return o;
}
function
Serializer_deserializeXml(xml){
// deserialize code ...
}
function
Serializer_serialize(obj, node, root){
if(node == null && root == null)
{
node = this._xml.documentElement;
root = this._xml;
}
if(obj == null)
{
var ele = root.createNode("element", "null", "");
node.appendChild(ele);
}
else if(typeof(obj) == "string")
{
var ele = root.createNode("element", "string", "");
ele.text = obj.valueOf();
node.appendChild(ele);
}
else if(typeof(obj) == "number")
{
var ele = root.createNode("element", "number", "");
ele.text = obj.valueOf();
node.appendChild(ele);
}
// else all other objects
return root.xml;
}
Now, you can use the code to save Javascript objects using ASP.NET (WebService) and a Database
<script>
var o = new Object();
o.OrderNumber = "615161";
o.CustomerName = "SIEMENS";
o.Quantity = 4000;
o.IsProduced = false;
var s = new Serializer();
SetCookieEx("currentorder", s.serialize(o));
// to get the object back from the webservice
var oo = GetCookieEx("currentorder");
if(oo.IsProduced)
alert(oo.CustomerName + " " + oo.OrderNumber)
</script>
Currently we are developing a second serializer (is already working with all Microsoft's WSDLs generated by .NET) to use the same objects as you use in C# or Visual Basic.NET.
public class MyClass
{
public string FirstName = "Michael";
public string LastName = "Schwarz";
public int Age = 0;
public DateTime Birthday = DateTime.MinValue;
}
[WebMethod(Description="")]
public MyClass GetMyObject()
{
return new MyClass(); // ok, very simple! ;)
}
Now, in Javascript the code will look like this:
<script>
var s = new Serializer();
var o = GetMyObject();
alert(o.FirstName + " " + o.LastName);
alert("Age = " + o.Age + "\r\nBirth: " + o.Birthday.toLocaleString());
</script>
When finished the second serializer for WSDL standard classes I will post the code here!
3 Comments
Comments have been disabled for this content.
Snorrk said
Very nice.
Take a look at the XMLHTTP thingy in IE and Moz. With a bit of tweaking you can call the webservice with client side code - no need to use cookies.
>S
Michael Schwarz said
Snorrk, there is no cookie used, it is call SetCookieEx because it was first a cookie, now it is a webservice call with XMLHTTP, of course.
Michael Schwarz said
George, seems to be a nice feature. Why I used xml is because we have a lot of xml streams and it is easier to convert an xml to another xml. But your solution will be shorter...