Re: Using prototype to define classes accessible by both the server-side (ASP) & client-side

Gareth Evans
Sun, 13 Jan 2008 19:25:53 -0000

As an aside, I develop in asp.net with prototype, and I can relate to what
Iain is saying- you have to define your markup twice, however.. don''t
jump
on the asp-bashing bandwagon just yet- you''d have to do the same in any
server side language- cold fusion, php, asp; they all suffer from this.
Unless you develop your application to be completely client side driven,
where the data is sent to the client and it is *transformed* to markup using
templates, new Element et al; you end up having to place your markup in two
places.

How do others get around this problem? it''s a pain to decide, for
example, a
column needs to be in another position and having to change the markup in
two places.
I can think of 3 solutions.

Solution 1
Store the ''template'' data on the server side. Write a class to
retreive it
on the server side, and use (.net here) reflection to dynamically evaluate
it, thus meaning the same markup structure #{key} can be used. On the client
side, extend new Template so that the markup can be retreived from a URL.
Solution 2
Keep your markup entirely on the server, render the page as per normal
except always render a hidden version of the markup with no data fields
evaluated - then when the user changes data, grab the blank version and
interpolate/evaluate your changes into it.
Solution 3
Store your markup in .js files and parse them on the server. do the same as
1.

Iain, I''ve not tried using js from a runat=server tag but I expect
it''s
something to do with prototype being fairly advanced js and the microsoft
interpreter being ''jscript''.
i would lean towards trying to find a different way to structure your
application so that you don''t need to include prototype on the server.
What variation are you using? vb.net / c#? .net 1 / 2? and what specific
functions were you trying to leverage in prototype for use on the server?

I don''t want to wind the PHP folk up here, but being able to leverage
the
.net framework and especially the Visual studio IDE speeds development up
for me.
I know there are similar ide''s available for other languages but I tend
to
feel that the php style of coding <? insert script here between your html
?>
is way too similar to the classic asp <% insert script here %> model which
never really worked in the first place.
PHP is definitely more advanced than classic asp, due to the large library
of functions available, but I hasten to point out that the grass is *always*
greener on the other side. Don''t let the opinion of
''asp'' cloud your
judgement of asp.net as it''s come a long long way.

Gareth


On Jan 13, 2008 11:09 PM, iporter
<isporter-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

>
> Thanks Matt, I appreciate your thoughts.
>
> On Jan 11, 2:22 pm, Matt Foster
<mattfoste...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> > I can''t say I fully understand your troubles with ASP, maybe
you
> > should boycott the evil empire and move on to greener pastures?
>
> The more I learn, the more I''m tempted.  But it would involve a
bit of
> a learning curve for which I don''t currently have time.
>
> > On the idea of having a web application that initiates with database
> > driven data on load and then has to interact with ajax requests to
> > update the document I suggest using a common service that serves XML.
> > Your asp environment will then be able to make the same call to
> > extract the XML and iterate over nodes for display as the ajax request
> > does.  In this way you only have one "middle tier" that
interacts with
> > your data.  You have two displays though, one for Ajax, one for
> > traditional web, not the best case but when you''ve got to
accommodate
> > a broad audience what can ya do.
>
> Yup, I think this is what I''m referring to when I say, ''I
guess I
> could have used AJAX to get the server-side code to return the
HTML.''
> The problem I have with this is that I''d have to pass all the
> parameters in addition to the data parameters.  For example, if I
> wanted to draw a menu with a server-side menu object, I''d have to
pass
> the database parameters plus menu object parameters like
''sortable'',
> ''collapsible'', etc.  This doesn''t seem
intuitive.
>
> > Hope that helps,
> >                    Matt
> >
> > On Jan 10, 6:40 pm, iporter
<ispor...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> >
> > > Although some javascript objects are client-specific (i.e.
document)
> > > and others server-specific (i.e. Response), much of prototype.js
can
> > > be used on the server-side.
> >
> > > In building a recent application, I found myself building
converting
> > > database data into HTML objects on the server-side, to ensure it
> > > readable by the search engines, but having to largely duplicate
that
> > > code for the client-side to redraw the HTML when the user updated
> > > things.  I guess I could have used AJAX to get the server-side
code to
> > > return the HTML.
> >
> > > But I still need to have a client-side object, because I need to
> > > unobtrusivly add client-side behaviours to the HTML.  Thus, what
I''d
> > > like to be able to do, is define a class in a .js file, and then
> > > inlcude that .js file with both the server-side and client-side
code.
> >
> > > If you put the code, function test() {return 1;} in a .js file,
> > > include this file in an ASP page using a <script
runat="server"> tag,
> > > and after this put <% Response.Write(test()) %>, you get
''1'' on the
> > > page.  However, if you add the code, var x = 2 to the .js file,
and
> > > put <% Response.Write(String(x)) %> in your ASP page, you
get
> > > ''undefined''.
> >
> > > Interestingly, if you then remove the code x = 2 from the .js
file,
> > > but leave the call in the ASP page, you get a runtime error
800a1391
> > > with a message saying, ''x is undefined''.
Didn''t our test before show
> > > it was already undefined?
> >
> > > The point being, that if functions work, but variables
don''t, then I
> > > can''t use prototype''s nice, var myClass =
Class.create({}); syntax.
> >
> > > What gives?  Can I get around this somehow?  Or perhaps this is
> > > ridiculous and you have a better approach to the problem?
> >
> > > Looking forward to your thoughts,
> > > Iain
> >