Viendo que hay varias cosas que tenemos que estandarizar de front end, comienzo por el tema de formularios. La regla es utilizar menos helpers y mas html por las siguientes razones:
El código es mas manejable por javascript
Es mas flexible para dar estilos por css
El código es mas limpio (html es un lenguaje universal, la sintaxis de los helpers no).
No dependemos de la version de html que implementen los helpers
Menos trabajo para el servidor
Las unicas dos excepciones para utilizar helpers son:
Combos
SecureActionLink (en el cual se usara el metodo sobrecargado que pide el html y el actionName)
La estructura típica de un formulario debería ser
<form action="<%= Model.Vehicle != null ? ResolveUrl("~/Vehicles/Edit") : ResolveUrl("~/Vehicles/Create") %>" method="post">
<%= Html.AntiForgeryToken() %>
<input type="hidden" name="entidad.propiedad" value="<%= (Model.Vehicle != null) ? Model.Vehicle.Id : 0) %>" />
<%= Html.ValidationSummary() %>
<ul>
<li>
<label for="Vehicle_Name">Nombre/Identificador:</label>
<div>
<input type="text" name="Vehicle.Name" id="Vehicle_Name" value="<%= (Model.Vehicle != null) ? Model.Vehicle.Name : string.Empty %>" class="required" maxlength="50"/>
<%= Html.ValidationMessage("Vehicle.Name")%>
</div>
</li>
<li>
<label for="Vehicle_Reseller">Revendedor:</label>
<div>
<%= this.Select("Vehicle.Reseller").Options<Reseller>(Model.Resellers, x => x.Id, x => x.Name)
.Selected((Model.Vehicle != null && Model.Vehicle.Reseller != null) ? Model.Vehicle.Reseller.Id : 0).FirstOption("0", "Elegir")%>
<%= Html.ValidationMessage("Vehicle.Reseller")%>
</div>
</li>
<li>
<input type="submit" value="Guardar Vehiculo" />
<a href="<%= ResolveUrl("~/Vehicles") %>" class="ui-state-default ui-corner-all default-button">Cancelar</a>
</li>
</ul>
</form>
Ahora vamos a desglosar por partes, en el action del form se debera poner la ruta a seguir en el caso de que sea un create (la entidad en nulo) y en el caso en el que sea un edit (entidad distinta de null).
En el caso de los hiddens se utilizaran inputs de la forma:
<input type="hidden" name="entidad.propiedad" value="<%= .... %>" />
La lista de propiedades de la entidad deberan encontrarse dentro de un ul, se recuerda que los tags "fieldset" no son usados.
Por cada item del ul "li" debera ir una propiedad con el siguiente formato:
<li>
<label for="entidad_propiedad">nombre propiedad en español:</label>
<div>
<input type="text" value="<%= ... %>" id="entidad_propiedad" name="entidad.propiedad"/>
<%= Html.ValidationMessage("entidad.propiedad")%>
</div>
<li>
Utilizar for en los labels indicando el id del input o select
En el caso de Combos utilizaremos el helper de MvcContrib por lo cual sera necesario agregar la siguiente clausula en el ascx/aspx:
<%@ Import Namespace="MvcContrib.FluentHtml" %>
La sintaxis a usar será:
<%= this.Select("entidad.propiedad").Options(Model.Resellers, x => x.Id, x => x.Name)
.Selected((Model.entidad != null && Model.entidad.Reseller != null) ? Model.entidad.Reseller.Id : 0).FirstOption("0","Elegir")%>
Siempre agregar un primer valor con value "0" y nombre "Elegir", a menos que el CU indique lo contrario
En el caso de que se necesite trabajar con fechas se utilizara en el html un input del tipo text y en javascript se agregara lo siguiente en el document ready:
$('#inputId').datepicker();
Teniendo en cuenta que se use la libreria de validacion modificada se creara un datepicker con toda la validacion de fechas incorporada.
En el caso de trabajar con checkbox se utilizaran los siguientes tags:
<input type="checkbox" name="Customer.Enabled" id="Customer_Enabled" value="true" <%= Model.Customer == null || (Model.Customer != null && Model.Customer.Enabled == Constants.True) ? "checked='checked'" : string.Empty %> />
<input type="hidden" name="Customer.Enabled" value="false" />
El primer input es el checkbox propiamente dicho, la condicion que se evalua adentro determina si tendra un atributo checked="checked"
o sea si se encontrara tildado el checkbox (en este caso si es un create se lo chequea, caso tipico de un habilitado por defecto).
El segundo input es un hidden que enviara el valor booleano como falso, en el caso de que no se tilde el checkbox.
Los botones de Guardar y Cancelar deberan encontrarse en un li con el siguiente formato:
<input type="submit" value="Guardar" />
<a href="<%= ResolveUrl("~/Controller") %>" class="ui-corner-all ui-state-default" >Cancelar</a>
Dicho ya lo basico pasemos a la parte de Validación
Deberá controlarse que se implementen en front end las validaciones puestas en el core usando los notations de nhibernate:
NotNullNotEmpty ó NotNull en una propiedad string: <input type="text" class="required" ....
Length(50) en una propiedad string: <input type="text" maxlength="50"
En el caso de ser numerico el valor utilizar: <input type="text" class="digits" ..
Para combos en los que la propiedad tenga NotNull:
<%= this.Select("entidad.propiedad").Options(Model.Resellers, x => x.Id, x => x.Name)
.Selected((Model.entidad != null && Model.entidad.Reseller != null) ? Model.entidad.Reseller.Id : 0).FirstOption("0","Elegir").Attr("min",1) %>
Todo esto, unido al plugin de validacion de jquery y a los controles que realiza el browser en el caso de maxlength, hará que los formularios sean mas claros para los usuarios y nuestro marcado será semanticamente correcto.