Introducción
La idea de esta serie de artículos es desarrollar un panel de comentarios usando: ReactJs, SignalR, Aspnet Mvc, MongoDb y Azure Service Bus, para muchos pueden ser cosas nuevas para otros no, el objetivo es aprender como todas estas tecnologías pueden trabajar de la mano. Todo esto nació luego de revisar el Tutorial de ReactJs.Net el cual me aprecio muy bueno pero sentía que se podían agregar más funcionalidades. El panel de comentarios esta compuesto por un formulario para agregar nuevos comentarios y una lista para ver los comentarios de todos los usuarios.
Por detrás este panel de comentarios está construido de la siguiente forma: el browser envía un post a la controladora, esta deja el mensaje en el Bus de mensajería, el mensaje se procesa asíncronamente, los resultados se almacenan en la base de datos y este nuevo comentario se envía a todos los usuarios que están conectados.
NOTA: Esta serie de artículos no trata de indagar en el detalle de cada cosa, mi objetivo es mostrar la integración de todas estas tecnologías, si quieren más información pueden ir a los sitios de cada uno de ellos para buscar el detalle que necesitan.
Tecnología
- Visual Studi 2015
- React JS
- C#
- Asp. Net MVC
- SignalR
- MongoDb
- Azure Service Bus
Presentación
Configuración del proyecto
Antes de empezar es recomendable instalar esta extensión para el soporte de archivos JSX en Visual Studio: https://visualstudiogallery.msdn.microsoft.com/d65d6b29-6dd7-4100-81b1-609e5afce356
Creamos un proyecto del Tipo ASP.NET Application, seleccionar la plantilla Empty y agregar la referencia de MVC.
Vamos al Administrador de paquetes de Nuget y agregamos la referencia de los paquetes System.Web.Optimization.React, React.Web.Mvc4, JQuery y Bootstrap al proyecto web.
Desarrollo UI con React JS
React JS es una librería de javascript desarrollada por Facebook para construir interfaces de usuario, para más información pueden leer la documentación oficial en este enlace. React JS nos permite crear componentes que pueden ser reutilizados y permiten formar otros componentes; además, tiene un gran rendimiento por el manejo del Virtual DOM. Teniendo en cuenta esto nuestro panel de comentarios estará compuesto de 4 componentes:
- RegistroComentario: Envía los nuevos comentarios al servidor
- DetalleComentario: Muestra el detalle de un comentario.
- ListaComentario: Muestra todos los comentarios que han sido grabados y está compuesto por el control DetalleComentario.
- PanelComentario: Está compuesto por el control FormComentario y ListaComentario.
RegistroComentario.jsx
Para empezar a registrar comentarios se necesita desarrollar un componente que nos permita enviar estos datos al servidor de la siguiente forma:
En la carpeta Scripts agregamos una carpeta llamada App y dentro un archivo llamado RegistroComentario.jsx con el siguiente código:
"use strict"; var RegistroComentario = React.createClass({ submitComentario: function (e) { console.log("It woks!!!!!!!"); e.preventDefault(); }, render: function () { return ( <form className="form-inline" onSubmit={this.submitComentario}> <div className="form-group"> <input type="text" className="form-control" placeholder="Alias" ref="autor" /></div> <div className="form-group"> <input type="text" className="form-control" placeholder="Comenta algo..." ref="texto" /></div> <input type="submit" value="Enviar" className="btn btn-primary" /> </form> ); } });
Ahora creamos una clase controladora llamada PanelController y agregamos el siguiente código:
public class PanelController : Controller { // GET: Panel public ActionResult Index() { return View(); } }
Agregamos la vista Index con el siguiente contenido:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <link rel="stylesheet" type="text/css" href="~/Content/bootstrap.css"> <title>Panel de comentarios</title> </head> <body> <div id="contenido"></div> <script src="~/scripts/jquery-2.2.0.js"></script> <script src="https://fb.me/react-0.14.0.js"></script> <script src="https://fb.me/react-dom-0.14.0.js"></script> <script src="~/scripts/App/RegistroComentario.jsx"></script> <script src="~/scripts/App/Main.jsx"></script> </body> </html>
Finalmente agregamos el archivo Main.jsx que será el encargado de mostrar el componente en pantalla.
"use strict"; ReactDOM.render(<RegistroComentario />, document.getElementById("contenido"));
Ahora para ver que todo esté bien compilamos la solución, presionamos f5 y navegamos a la url Panel/Index luego de hacer clic en el botón Enviar debemos ver en la consola del navegador el mensaje It works!!!.
DetalleComentario.jsx
Para ver cada comentario se necesita desarrollar un componente que nos permita visualizar el detalle de cada uno de la siguiente forma: En la carpeta Scripts agregamos un archivo llamado DetalleComentario.jsx con el siguiente código:
"use strict"; var DetalleComentario = React.createClass({ render: function () { return ( <a href="#" className="list-group-item"> <h4 className="list-group-item-heading">{this.props.autor}</h4> <span className="list-group-item-text" dangerouslySetInnerHTML={{__html:this.props.children.toString()}} /> </a> ); } });
Vamos a la vista Index y agregamos la referencia al nuevo archivo:
<script src="~/scripts/App/DetalleComentario.jsx"></script>
Finalmente abrimos el archivo Main.jsx y reemplazamos su contenido por el siguiente:
"use strict"; ReactDOM.render( <DetalleComentario autor="berczeck">Primer comentario</DetalleComentario> , document.getElementById("contenido"));
Ahora para ver que todo esté bien compilamos la solución, presionamos f5 y navegamos a la url Panel/Index y debemos ver un comentario en pantalla.
ListaComentario.jsx
Para ver todos los comentarios se necesita desarrollar un componente que nos permita listar cada uno de los comentario de la siguiente forma:
En la carpeta Scripts agregamos un archivo llamado ListaComentario.jsx con el siguiente código:
"use strict" var ListaComentario = React.createClass({ render : function (){ var comentarios = this.props.comentarios.map(function(comentario){ return <DetalleComentario key={comentario.Identificador} autor={comentario.Autor} fechaHora={comentario.FechaHora }>{comentario.Texto} </DetalleComentario> } ); return ( <div className="list-group"> {comentarios}</div> ); } } );
Vamos a la vista Index y agregamos la referencia al nuevo archivo:
<script src="~/scripts/App/ListaComentario.jsx"></script>
Abrimos el archivo Main.jsx y reemplazamos su contenido por el siguiente:
"use strict"; var data = [ { Autor: "Scrumcito", Texto: "Apliquemos scrum a todo", FechaHora: "11/11/2011 11:11:11", Identificador: "4321" }, { Autor: "ArquitectoPpt", Texto: "Todo esta en la ppt", FechaHora: "12/12/2012 12:12:12", Identificador: "1234" } ]; ReactDOM.render( <ListaComentario comentarios={data} /> , document.getElementById("contenido"));
Ahora para ver que todo esté bien compilamos la solución, presionamos f5 y navegamos a la url Panel/Index y debemos ver una lista de comentarios en pantalla.
PanelComentario.jsx
Para ver el panel de comentarios se necesita desarrollar un componente que nos permita unir todos los componentes previamente desarrollados de la siguiente forma: En la carpeta Scripts agregamos un archivo llamado PanelComentario.jsx con el siguiente código:
"use strict" var PanelComentario = React.createClass({ render: function () { return ( <div className="panelComentarios"> <h1>Panel de comentarios</h1> <RegistroComentario /> <ListaComentario comentarios={this.props.data}/></div> ); } });
Vamos a la vista Index y agregamos la referencia al nuevo archivo:
<script src="~/scripts/App/PanelComentario.jsx"></script>
Abrimos el archivo Main.jsx y reemplazamos su contenido por el siguiente:
"use strict"; var data = [ { Autor: "Scrumcito", Texto: "Apliquemos scrum a todo", FechaHora: "11/11/2011 11:11:11", Identificador: "4321" }, { Autor: "ArquitectoPpt", Texto: "Todo esta en la ppt", FechaHora: "12/12/2012 12:12:12", Identificador: "1234" } ]; ReactDOM.render( <PanelComentario data={data} /> , document.getElementById("contenido"));
Ahora para ver que todo esté bien compilamos la solución, presionamos f5 y navegamos a la url Panel/Index y debemos ver el panel de comentarios en pantalla.
El código puede ser descargado desde este enlace.
Referencias:
Metal Tip:
Este artículo lo escribí escuchando la canción Demoledor de la banda M.A.S.A.C.R.E de mi país Perú, les comparto el enlace.
Happy coding and Stay Heavy lml