Biasanya dlm ASP.NET MVC, utk tulis view kita akan buat something mcm ni:
<div class="formcontainer">
<% Html.BeginForm() %>
Your Name : <%= Html.TextBox("Name") %><br />
Your Age: <%= Html.TextBox("Age") %><br />
<%= Html.SubmitButton() %>
<% Html.EndForm() %>
</div>
Aku sebenarnya tak berapa suka campur aduk HTML dgn codes mcm ni,
walaupun cara ni dah diguna sebegitu lama dari zaman ASP, dan masih
digunakan dgn meluas dlm PHP, Rails, etc. Terlalu byk angle brackets
yg mencucuk mata, susah nak baca code dgn noise2 yg byk mcm ni.
Aku suka konsep NHaml
(http://andrewpeters.net/2007/12/19/introducing-nhaml-an-aspnet-mvc-view-engine/)
yg ringkas, tapi tak mahu leceh2 add reference to another view engine.
Inspired by cl-who (http://weitz.de/cl-who/), dan beberapa framework
lain mcm Nitrogen (http://nitrogenproject.com/), aku terfikir utk
buang sama sekali (almost) HTML dan gunakan C# shj utk construct
views. Something like this:
<%
Html.Div(new { @class="formcontainer" }).
Form().
Label("Your Name", "Name").TextBox("Name").
Br().
Label("Your Age", "Name").TextBox("Age").
Br().
SubmitButton().
%>
Nice huh? Ada idea mcm mana nak buat? Rasanya tak susah sgt, maybe
boleh extend a class dari HtmlHelper (atau copy code buat class lain,
source is opened).
Kelebihannya
- Code yg lebih bersih
- Kita stay in C#, malahan boleh tulis code ni dlm controller instead of view
- Probably tak perlukan new view engine, ini guna ASP.NET view engine yg biasa
- Less mental hurdle utk create widget (webcontrol) sendiri. Maybe mcm
eg Label("D.O.B", "Dob").Calendar("Dob", new {
dateFormat="dd/MM/yyyy", autoSelectToday=false });
- Aku expect code ni akan nampak lebih cantik dlm F#, atau dlm C# 4.0
sbb ada named parameter.
Kita nak something yg mcm HtmlHelper, tapi fluent. Aku suspect
masalahnya kat sini ialah mcm mana nak simpan generated html tu,
probably kena ada stack, sbb kita kena track start tags dgn its
matching end tags, eg:
Div().
Form().
Label("A label", "SomeControl").TextBox("SomeControl");
Mcm mana kita nak tahu bila nak tutup form tu dgn </form>.
Cara lebih mudah ialah kita boleh buat someting mcm ni (tapi kurang cantik):
Div().Inner(
Form().Inner(
Label("A label", "SomeControl").TextBox("SomeControl")
)
)
Aku rasa benda2 ni dah ada somewhere dlm Xml punya namespace, tapi tak
research lagi.
2009/1/7 ryzam <irwa...@gmail.com>:
Noticing a lot of typo in my writing lately :P
Target output yg dimahukan ialah
<table border="1">
<tr>
<td style="font-weight:bold">Name</td>
<td><input id="txtName" type="text" /></td>
</tr>
<tr>
<td style="font-weight:bold">Age</td>
<td><input id="txtAge" type="text" /></td>
</tr>
</table>
Cara ASP.NET MVC biasa ialah
<table border="1">
<tr>
<td style="font-weight:bold">Name</td>
<td><%= Html.TextBox("txtName") %></td>
</tr>
<tr>
<td style="font-weight:bold">Age</td>
<td><%= Html.TextBox("txtAge") %></td>
</tr>
</table>
Guna cara yg aku buat ni, aku panggil HtmlFlow (ikut style name HtmlHelper)
<%= Html.BeginFlow()
.Table(new { border = "1" }).Push()
.Tr().Push()
.Td("Name", new { style = "font-weight:bold" })
.Td().Push()
.TextBox("txtName")
.Pop()
.Pop()
.Tr().Push()
.Td("Age", new { style = "font-weight:bold" })
.Td().Push()
.TextBox("txtAge")
.Pop()
.Pop()
.Pop()
%>
BURUK GILER! Haha. Tak tau lah... Nampak tak lawa sbb ada Push() and
Pop() sbg indicator kat mana inner HTML bermula/berakhir supaya dia
tak directly close tags. Cuba kalau buang:
<%= Html.BeginFlow()
.Table(new { border = "1" })
.Tr()
.Td("Name", new { style = "font-weight:bold" })
.Td()
.TextBox("txtName")
.Tr()
.Td("Age", new { style = "font-weight:bold" })
.Td()
.TextBox("txtAge")
%>
Looks a bit better :P Tapi tak tahu mcm mana nak buat.. Kalau boleh
nak override operators, tapi takde operators yg sesuai. Something like
<%= Html.BeginFlow()
.Table(new { border = "1" }) <
.Tr() <
.Td("Name", new { style = "font-weight:bold" })
.Td() < .TextBox("txtName") >
>
.Tr() <
.Td("Age", new { style = "font-weight:bold" })
.Td() < .TextBox("txtAge") >
>
>
%>
Kat sini operator "<" dan ">" dah dioverride sbg Push() dan Pop().
Tapi tak dapat la buat mcm ni.
C# is sooo not suitable for making DSL.
Very crude and experimental tho :P