2011-06-07 51 views
6

Estoy usando ASP.NET con C# 2.0. He creado algunos objetos para una base de datos y cada uno de estos objetos tiene propiedades que se pueden llamar de forma nativa o se llaman de manera similar y crear una API JSON RESTful.Método del lado del servidor y del lado del cliente

Tengo muchas cosas parecidas a pestañas que me gusta llamar 'módulos' en este sitio: la función de un módulo es convertir datos a HTML para que se muestren en la página. Idealmente, esto debe hacerse tanto en el código C# del lado del servidor para cargar la primera pestaña, luego usar Ajax para cargar los otros cuando se hace clic en las pestañas, sin embargo, para navegadores antiguos y motores de búsqueda, la pestaña sigue siendo un enlace que cargará el mismo lado del servidor de código HTML.

Actualmente he escrito el código JavaScript completamente por separado del código C# que convierte cada módulo a HTML, pero el método es prácticamente el mismo, simplemente un idioma diferente. Similar a este ejemplo.

código C#

public override string GetHtml() 
{ 
    IJsonObjectCollection<Person> response = ((Village)page).People; 
    string html = "<div id=\"test\">"; 
    foreach (Person person in response) 
    { 
     html += "<div class=\"person\">"; 
     html += person.Name; 
     if(canEdit) html += "*"; 
     html += "</div>"; 
    } 
    return html + "</div>"; 
} 

código JavaScript

function getHtml() { 
    JsonRequest('/json/villages/1/people', function(response) { 
     var html = '<div id="test">'; 
     for (int i = 0; i < response.length; i++) 
     { 
      var person = response[i]; 
      html += '<div class="person">'; 
      html += person.name; 
      if(canEdit) html += '*'; 
      html += '</div>'; 
     } 
     return html + '</div>'; 
    }); 
} 

probablemente Se puede ver donde voy con esta pregunta. ¿Cuál sería la forma más eficiente de hacer esto? Estaba pensando en algunas alternativas diferentes:

1. Cada ModuleToHtmlMethod podría ser una clase que define el método de convertir este objeto de datos en HTML. Intenté esto, pero me detuve porque me estaba volviendo demasiado complicado.

2. escribir mi propio lenguaje de script que puede ser interpretado como C#, sino también 'compilado' en el código JavaScript.

3. Sólo tiene que escribir el lote en C# y utiliza Ajax para solicitar simplemente el contenido HTML de C#

4. mantener el código separado y escribir todos los métodos dos veces.

Me gustaría permitir que otros desarrolladores escriban estos 'módulos', por lo que tal vez la opción es la mejor opción?

Respuesta

1

Descartaría la opción 4, ya que dificultará el mantenimiento y puede terminar sin sincronización entre el código HTML generado a través del Javascript y el del código C#. También descartaría la opción 2, ya que puede hacer que el código sea más difícil para otros desarrolladores y también probablemente innecesario.

Definitivamente generaría el HTML en un solo lugar y probablemente exponga la API RESTful HTML que usa la función existente C# para devolver los fragmentos de HTML. Por lo tanto, desde su Javascript debe llamar a:

function getHtml() { 
    MyHtmlRequest('/html/villages/1/people', function(response) { 
     var html = response.Text; 
     return html; 
    }); 
} 
+0

creo que este es probablemente el mejor camino a seguir. El problema aquí es que la mayoría del código está en bucles (que pueden ser bastante grandes), por lo que la mayoría de los html se repetirían, lo que aumentaría drásticamente el tamaño de la respuesta. ¿La compresión gzip me ayudaría aquí? – Connell

+0

Al usar gzip debe afeitarse el 50-70% del tamaño de la respuesta, es su llamada para ver si es aceptable. Debería calcular la diferencia en Bytes entre la misma respuesta utilizando la API JSON RESTful y la API HTML RESTful. Si la diferencia es inferior al 50%, gzip sin duda resolverá la sobrecarga del marcado. –

+0

No es necesario que lo pruebe para decirle que tendrá que ser más del 50% adicional. Hay bucles que generalmente giran alrededor de 10-20 veces, pero pueden extenderse a 50 impar, dependiendo del tipo de datos llamados. Entonces el código html es similar a ''

'+row.name+' Edit
' o similar. Por lo general, más HTML, tal vez un botón de eliminación. – Connell

1

Un par de sugerencias.

  • Tienen un método GetHtml genérico que refleja el html. Esto puede ser difícil ya que la IU no es algo que se pueda asignar fácil y uniformemente a los campos de datos.
  • Tener una meta descripción de los 'módulos', se utiliza para crear sus métodos GetHtml genéricos
  • Finalmente try this: Se permitirá que acaba de crear métodos de JavaScript, a continuación, puede llamarlos desde C#

Me gustaría ir a la segunda opción de meta descripción ya que esto es lo que hago para mis capas de datos. Básicamente tengo un archivo que define mi modelo de dominio. Utilizo esto para generar todos mis datos acccess pocos, archivos de configuración nhibernate, etc. Luego tengo un archivo de metadatos que agrega información a estos objetos, como información de representación de UI e información de validación de campo.

TNX

Guido

+0

En su segunda opción, ¿se refiere a una descripción legible por el ser humano que le permite escribir exactamente la misma función en muchos idiomas, o una descripción legible por máquina que podría usarse de manera similar a mi segunda opción? – Connell

+0

Me refiero a un generador de código. Entonces defines un 'archivo de descripción' y luego generas todos tus métodos getHtml. Básicamente, lo que termina sucediendo es que describes todos tus módulos en una DSL (xml o json está bien, es posible que desees consultar [T4] (http://msdn.microsoft.com/en-us/library/bb126445). aspx)). Así que sí, es como su opción 2, pero es mucho más simple que escribir su propio lenguaje de scripting. – gatapia

+0

Hmm ... Puedo ver cómo funciona esto con javascript. Una vez que se genera el código C#, ¿simplemente copio el código en el código C#? ¿O tendré alguna forma elegante de interpretar esta definición o compilarla? – Connell

Cuestiones relacionadas