Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tutorial Web Matrix PDF
Tutorial Web Matrix PDF
org
Twitter: @fredyfx
Duracin del tutorial: 1 Hora y 45 Minutos, 105 minutos en total distribuidos en: 15 de
introduccin, 80 de programacin y 10 de preguntas/respuestas. Si faltase tiempo, con
gusto las dudas que tengan sern respondidas mediante correo electrnico o va twitter.
Celulares en silencio.
Tener sus sentidos enfocados en el presente tutorial.
Leer detenidamente este material.
Prohibida la navegacin en internet y reproduccin de msica.
Las preguntas se realizarn al final; se sugiere anotar cualquier tipo de duda para
luego hacerla saber; en caso falte tiempo para la resolucin de dudas, va correo
electrnico obtendrn respuestas.
Previo a la Instalacin
[02 minutos]
Actualmente sus computadoras ya se encuentran configuradas con todos los elementos que
utilizaremos, como vern en la imagen adjunta, tenemos instalado algunos mdulos, como
el soporte para PHP, s, tal y como estn pensando: Pero PHP no solo corre sobre un
apache? Tambin corre sobre Internet Information Services (ms conocido como IIS,
servidor web de Microsoft)
Advertencia
[01 minuto]
Si tambin programan utilizando un servidor local como apache (con netbeans / eclipse /
wamp / xampp), tendrn problemas con el puerto 80 ya que lo estar usando el IIS
(referencia: localhost). Para solucionar este asunto tienen 2 opciones:
Por efectos de practicidad, veremos la 2da opcin: nos dirigimos a Panel de control ->
Programas -> Programas y caractersticas -> Activar o desactivar las caractersticas de
Windows. Desmarcamos todo Internet Information Services, si requiere reinciar la
computadora, se reinicia y listo!
Caractersticas
[03 minutos]
Soporta PHP.
Internet Information Services Express [IIS Express] -> Servidor Web
ASP.net (VB | C#) -> Web Framework.
SQL Server Compact Edition [SQL Server CE] -> Gestor de Base de Datos nativo,
tambin soporta conexin con MySQL [Requiere un conector adicional].
Anlisis de SEO y Rendimiento.
La intefaz que utiliza WebMatrix, es sencilla permitiendo una fcil navegacin, del mismo
modo, los elementos son muy intuitivos, por lo cual permite adaptarse en poco tiempo, a su
vez, cabe mencionar que el men principal que posee cuenta con estilo Ribbon (el cual
apareci en Office 2007).
HTML Bsico
[10 minutos]
Los elementos HTML son componentes que especifican como los documentos HTML deben
ser construidos y que tipo de contenido debe ser posicionado en que lugar de un documento
HTML.Los nombres de elementos son encerrados entre picos, tambin denominados
parntesis angulares: <NombreElemento>, los cuales son llamados etiquetas. Si el elemento
contiene otro contenido, este termina con una etiqueta de cierre, donde el nombre del
elemento es precedido por un slash: </NombreElemento>.
Etiquetas Descripcin
<a> Es uno de los elementos ms importantes del HTML. Es el encargado de crear
</a> los tpicos vnculos hipertextuales. Puede actuar como origen y como destino
de estos enlaces. Adems son muy apreciadas sus capacidades dinmicas.
<br /> br de "break" - ruptura. Fuerza al ruptura (o salto) de linea.
<div> div de "division" - divisin. Sirve para crear secciones o agrupar contenidos.
</div>
<fieldset> El elemento fieldset (grupo de campos) permite organizar en grupos los
/fieldset> campos de un formulario.
<legend> El elemento <legend> (leyenda) crea un ttulo para un grupos los campos
</legend>
(<fieldset>) de un formulario.
<p></p> El elemento p (prrafo) es el apropiado para distribuir el texto en prrafos.
<input> El elemento input (<input>) es usado para crear controles interactivos para
formularios basados en la web.
<img> Esta etiqueta inserta una imagen.
body, div, span, p, a, img, ul, ol, li, table, th, tr, td, form, fieldset, legend,
dl, dt, dd, blockquote, applet, object {
border:0;
}
body {
padding: 15px;
font: 12px/1.4 Verdana, Helvetica, sans-serif;
font-size: 12px;
color: #000;
width: 960px;
background-color: rgba(0, 0, 0, 0.07);
}
#header{
width: 960px;
height: 150px;
background-color: #235980;
color: #fff;
}
#login{
float: right;
padding-top: 20px;
padding-right: 20px;
clear: none;
}
#titulo{
clear: none;
padding: 20px;
}
#menu{
background-color: #235980;
width: 960px;
color: #fff;
}
#menu li{
border-color: #ff6a00;
border-style: solid;
display: inline;
padding: 10px;
#help li{
font-size: 10px;
display: inline;
}
a:hover {
background-color: #2586d7;
color: #ecff00;
}
a {
color:#fff;
text-decoration:none;
border:none;
}
.enlace{
color: #000;
}
.footer {
background-color: #235980;
text-align: center;
color: #fff;
font-size: 12px;
margin-top: 20px;
padding: 5px;
}
img a {
border:none;
}
h1 {
font-size:230%;
}
h2 {
font-size:183%;
font-weight: bold;
}
h4 {
font-size:120%;
font-weight: bold;
}
h5 {
font-size:100%;
}
h1.title {
border-bottom:1px dotted #84a1af;
margin:0 0 20px 0;
}
label {
float:left;
width: 15em;
margin-right: 6em;
}
fieldset {
padding: 1em;
border: 1px solid;
width: 35em;
}
legend {
padding: 2px 4px;
border: 1px solid;
font-weight:bold;
}
/* Para el slider*/
/* el rectangulo contenedor */
#slider_container_1 {
.cherryR{
float: right;
}
Sintaxis Razor
[10 minutos]
@{ var numero = 7; }
@{ var saludo = "Greetings World, we are programmers!"; }
@{
var diasemana = DateTime.Now.DayOfWeek;
var saludocompleto = saludo + " Hoy es: " + diasemana;
var saludoCompleto = saludo + " este es otro saludo";
}
Todas las pginas que veremos en este tutorial tendrn el siguiente esquema:
@{
var mensaje = "Tutorial Microsoft WebMatrix";
}
<head>
<meta charset="utf-8">
<meta name=description
content="tutorial desarrollado para el IX Congreso Internacional de
Ingeniera de Software,
Sistemas de Informacin y Telecomunicaciones
UPAO 2012">
<title >:: IX Congreso Sistemas, Software, Telecomunicaciones UPAO::</title>
<link rel="stylesheet" type="text/css" media="screen"
href="@Href("~/style/StyleSheet.css")" />
<script src="@Href("~/js/sliderman.1.3.6.js")"
type="text/javascript"></script>
</head>
<div id="header">
<div id="login">
@if(WebSecurity.IsAuthenticated)
{
<p>Bienvenido, @WebSecurity.CurrentUserName |
else
{
<form method="post" action="@Href("~/account/login.cshtml")">
Usuario: <input type="text" name="username">
Password: <input type="password" name="password">
<input type="submit" title="Acceder al sistema">
</form>
<div id="help">
<ul>
<li><a href="#">Olvid mi password</a></li>
<li><a href="@Href("~/account/new.cshtml")">| Cuenta
nueva</a></li>
<li> | Exactamente son: @DateTime.Now</li>
</ul>
</div>
}</div>
<div id="titulo">
<a href="@Href("~/index.cshtml")"><h1>@mensaje</h1></a>
<h2><a href="http://www.upao.edu.pe/congreso_sistemas/2012"
target="_blank">
IX Congreso Internacional de Ingeniera de Software,
Sistemas de Informacin y Telecomunicaciones
UPAO 2012
</a>
</h2>
</div>
</div>
<br />
<div id="menu">
<ol>
<li><a href="@Href("~/intro.cshtml")">Introduccion</a></li>
<li><a href="@Href("~/form.cshtml")">Formularios</a></li>
<li><a href="@Href("~/crud/read.cshtml")">Operaciones CRUD</a></li>
<li><a href="@Href("~/reports.cshtml")">Reportes</a></li>
</ol>
</div>
Footer
<div class="footer">
Tutorial Desarrollo de Aplicaciones Web con Microsoft WebMatrix Todos los
derechos reservados - 2012
</div>
El resultado:
Programacin bsica
[05 minutos]
intro.cshtml
@{
/*
Response.CacheControl = "no-cache";
if (!WebSecurity.IsAuthenticated) {
var returnUrl = "~/index.cshtml";
Response.Redirect(returnUrl);
}
*/
}
<!DOCTYPE html>
<html lang="es-pe">
@RenderPage("~/style/header.cshtml")
<body>
<h1>Comenzando a programar en la Web!</h1>
<p>Esperamos que el presente tutorial sea de su agrado</p>
@{
// Estructuras condicionales simples
var saldo = 4.99;
En la programacin de aplicaciones web, tenemos que tener en cuenta que son envos de
peticiones http al servidor, por lo que se utilizan POST y GET, ambos envan las variables, a
diferencian de GET que hace uso del paso de las mismas va url, POST no lo hace. Luego de
programar form.cshtml podremos ver con mayor claridad la diferencia mencionada.
form.cshtml
Editamos el archivo form.cshtml con el siguiente cdigo:
<!DOCTYPE html>
<html>
@RenderPage("/style/header.cshtml")
<body>
<h1>Bienvenido al tutorial</h1>
<div style="float: left; margin-right: 10px;">
<fieldset>
<form action="" method="post">
<div>
Ingrese su nombre:
<input type="text" name="vnombre" value="">
<input type="submit" value="Enviar!" />
</div>
<div>
@if (IsPost){
if (Request["vnombre"].IsEmpty()){
<p style="color: #ff0000">*No olvide ingresar su nombre</p>
}else{
<p> Bienvenido: <b> @Request["vnombre"] ! </b>
Preprate, vamos a programar en la web
</p>
}
}
</div>
</form>
</fieldset>
<br />
</div>
<fieldset>
<form action="" method="get">
Numero A:<input type="text" name="numeroa" size="4" />
Numero B:<input type="text" name="numerob" size="4" />
<input type="submit" value=" La suma es: "/>
@{
float numeroa = Request.QueryString["numeroa"].AsFloat();
float numerob = Request.QueryString["numerob"].AsFloat();
float resultado = numeroa+numerob;
if(Request.QueryString["numeroa"].IsEmpty() ||
Request.QueryString["numerob"].IsEmpty()){
<p style="color: #ff0000">*No olvide ingresar datos numricos</p>
}else{
En esta ocasin creamos una base de datos llamada Tutorial haciendo uso de SQL Server
Compact Edition, del siguiente modo:
En la creacin de tablas, debemos tener siempre en cuenta cules sern nuestras llaves
primarias, y si sern autogeneradas (1, 2, 3, 4) por la misma base de datos.
Ahora a poblar la tabla! Para ello nos dirigimos hacia Datos, y bueno, insertamos datos:
Sintaxis:
INSERT INTO <NombreTabla> (campo1, campo2, ) VALUES (valor1, valor2, )
Ejemplo:
INSERT INTO productos (nombre, descripcion, precio, stock) VALUES ('pilas
duracell','baterias de larga duracion',2.50,40)
Read
Al igual que un Hola mundo que es la primera lnea de cdigo que vemos al iniciar en el
mundo de la programacin, con las consultas en base de datos iniciamos con un SELECT *
FROM <NombreTabla>, esto quiere decir que seleccionar todos los campos que se
encuentren en la tabla definida.
Sintaxis:
SELECT <campo1>, <campo2>,<campo3>,<campoN-1>, <campoN> FROM <NombreTabla>
Ejemplo:
SELECT id, nombre, descripcion, precio, stock FROM productos
Sintaxis:
UPDATE <tabla>
SET <campo1> = <nuevo valor>,
<campo2> = <nuevo valor>
WHERE <condicin>
Ejemplo 01:
UPDATE productos
SET nombre='bluetooth', descripcion='sinmark v2',
precio=25.70, stock=20
WHERE id=5
Ejemplo 02:
UPDATE productos
SET stock=100
WHERE id<15
Sintaxis:
DELETE FROM <NombreTabla> WHERE <Condicin>
Ejemplo:
DELETE FROM productos WHERE id=6
Login
[10 minutos]
Para tener un login, primero que debemos hacer es tener una tabla llamada usuarios con
las siguientes caractersticas:
_AppStart.cshtml
Ahora procederemos a crear un archivo llamado _AppStart.cshtml, este archivo se
ejecutar al iniciar nuestra aplicacin, el cdigo que contiene es el siguiente:
@{
WebSecurity.InitializeDatabaseConnection("Razor",
"usuarios", "usuarioid", "email", true);
}
<!DOCTYPE html>
<html lang="es-pe">
Carpeta account
Archivo para crear nuevas cuenta de usuario, en la raz del proyecto crearemos una carpeta
llamada account con los siguientes archivos
new.cshtml
@{
var username = "";
var password = "";
var confirmPassword = "";
var errorMessage = "";
if(!IsPost)
{
if(WebSecurity.IsAuthenticated){
errorMessage = String.Format("Ests actualmente logeado. (Usuario:
{0})",
WebSecurity.CurrentUserName);
}
}
if(IsPost)
{
WebSecurity.Logout();
username = Request["username"];
password = Request["password"];
confirmPassword = Request["confirmPassword"];
if(username.IsEmpty())
{
ModelState.AddError("username", "Complete el nombre de usuario");
}
login.cshtml
@{
var username = "";
var password = "";
var errorMessage = "";
if(IsPost){
username = Request["username"];
password = Request["password"];
if(username.IsEmpty() || password.IsEmpty()){
Response.Redirect("~/index.cshtml");
}else{
if(WebSecurity.Login(username,password,true)){
Response.Redirect("~/intro.cshtml");
}else
{
errorMessage = "Login was not successful.";
}
}
}
}
<!DOCTYPE html>
<html lang="es-pe">
@RenderPage("~/style/header.cshtml")
<body>
<h1>Login</h1>
<fieldset>
<form method="post">
@if(WebSecurity.IsAuthenticated){
<p>You are currently logged in as @WebSecurity.CurrentUserName.
<a href="@Href("~/Logout")">Log out</a>
</form>
</fieldset>
<p>
@if(errorMessage != ""){
<span class="errorMessage">@errorMessage</span>
}
</p>
@RenderPage("~/style/footer.cshtml")
</body>
</html>
logout.cshtml
@{
WebSecurity.Logout();
Response.Redirect("~/index.cshtml");
}
Carpeta crud
Debemos tener nuestra base de datos creada y con algunos datos ingresos como en el
ejemplo antes mostrado.
@{
Response.CacheControl = "no-cache";
if (!WebSecurity.IsAuthenticated) {
var returnUrl = "~/index.cshtml";
Response.Redirect(returnUrl);
}
var db = Database.Open("Razor");
var selectQueryString = "SELECT * FROM productos ORDER BY id";
db.Close();
}
<!DOCTYPE html>
<html lang="es-pe">
@RenderPage("../style/header.cshtml")
<body>
<div id="contenido">
<h1>Listando Productos</h1>
<form action="create.cshtml">
<button onclick="">Agregar nuevo producto</button>
</form>
<br />
<table>
<thead>
<tr>
<th>Id</th>
<th>Producto</th>
<th>Descripcion</th>
<th>Precio</th>
<th>Stock</th>
<th>Operaciones</th>
</tr>
</thead>
<tbody>
@foreach(var row in db.Query(selectQueryString)){
<tr>
<td>@row.id</td>
<td>@row.nombre</td>
<td>@row.descripcion</td>
<td>@row.precio</td>
<td>@row.stock</td>
<td><a class="enlace"
href="@Href("~/crud/update.cshtml",row.id)">Editar</a> | <a class="enlace"
href="@Href("~/crud/delete.cshtml", row.id)">Eliminar</a></td>
</tr>
}
create.cshtml
@{
Response.CacheControl = "no-cache";
if (!WebSecurity.IsAuthenticated) {
var returnUrl = "~/index.cshtml";
Response.Redirect(returnUrl);
}
// Si se ha recargado la pgina
if (IsPost) {
descripcion = Request["descripcion"];
if (descripcion.IsEmpty()) {
ModelState.AddError("descripcion", "Se necesita la descripcion del
producto.");
}
stock = Request["stock"];
if (stock.IsEmpty()) {
ModelState.AddError("stock", "Se necesita el stock del producto.");
}
if(ModelState.IsValid) {
// Establecemos la consulta de insercin.
var insertQuery = "INSERT INTO Productos (nombre, descripcion, precio,
stock) " +
"VALUES (@0, @1, @2, @3)";
db.Execute(insertQuery, nombre, descripcion, precio.AsFloat(),
stock.AsInt());
// Mostramos la pgina que contiene la lista de productos.
Response.Redirect(@Href("~/crud/read.cshtml"));
db.Close();
}
}
}
<!DOCTYPE html>
<html>
@RenderPage("../style/header.cshtml")
<body>
<h1>@titulo</h1>
<div style="float: left;clear: none">
<form method="post" action="">
<fieldset>
<legend>Registros</legend>
<div style="clear: none;">
<label>Nombre:</label>
<input name="nombre" type="text" size="50" value="@nombre" />
</div>
<div>
<label>Descripcion:</label>
<input name="descripcion" type="text" size="50"
value="@descripcion" />
</div>
<div>
<label>Precio:</label>
<input name="precio" type="text" size="50" value="@precio" />
</div>
<div>
<label>Stock:</label>
<input name="stock" type="text" size="50" value="@stock" />
</div>
<div>
<br />
@if ( Roles.IsUserInRole("master"))
{
<input type="submit" value=" Registrar nuevo producto! "
size="50"/>
update.cshtml
@{
Response.CacheControl = "no-cache";
if (!WebSecurity.IsAuthenticated) {
var returnUrl = "~/index.cshtml";
Response.Redirect(returnUrl);
}
var db = Database.Open("Razor");
var consulta = "SELECT * FROM productos WHERE id=@0";
var productoid = UrlData[0];
if (productoid.IsEmpty()) {
Response.Redirect(@Href("~/crud/read.cshtml"));
}
if (IsPost) {
if (String.IsNullOrEmpty(nombre)) {
ModelState.AddError("nombre", "Se necesita el nombre del producto.");
}
descripcion = Request["descripcion"];
if (String.IsNullOrEmpty(descripcion)) {
ModelState.AddError("descripcion", "Se necesita la descripcion del
producto.");
}
stock = Request["stock"];
if (String.IsNullOrEmpty(stock)) {
ModelState.AddError("stock", "Se necesita el stock del producto.");
}
precio = Request["precio"];
if (String.IsNullOrEmpty(precio)) {
ModelState.AddError("precio", "Se necesita el precio del producto.");
}
if(ModelState.IsValid) {
var updateQueryString =
"UPDATE productos SET nombre=@0, descripcion=@1, precio=@2, stock=@3
WHERE id=@4" ;
db.Execute(updateQueryString, nombre, descripcion, precio, stock,
productoid);
Response.Redirect(@Href("~/crud/read.cshtml"));
}
}
}
<!DOCTYPE html>
<html>
@RenderPage("../style/header.cshtml")
<body>
<h1>Editando producto</h1>
<p>@Html.ValidationSummary("Errors encontrados:")</p>
delete.cshtml
@{
Response.CacheControl = "no-cache";
if (!WebSecurity.IsAuthenticated) {
var returnUrl = "~/index.cshtml";
Response.Redirect(returnUrl);
}
var db = Database.Open("Razor");
var productoid = UrlData[0];
if (productoid.IsEmpty()) {
Response.Redirect(@Href("~/crud/read.cshtml"));
}
</fieldset>
</form>
@RenderPage("~/style/footer.cshtml")
</body>
</html>
pricereport.cshtml
@{
var db = Database.Open("Razor");
var data = db.Query("SELECT nombre, precio FROM productos");
var myChart = new Chart(width: 600, height: 400, theme:ChartTheme.Green)
.AddTitle("PRECIOS de los productos de la tienda Razor")
.DataBindTable(dataSource: data, xField: "nombre")
.Write();
}
stockreport.cshtml
@{
var db = Database.Open("Razor");
var data = db.Query("SELECT nombre, stock FROM productos");
var myChart = new Chart(width: 600, height: 400)
.AddTitle("STOCK de los productos de la tienda Razor")
.DataBindTable(dataSource: data, xField: "nombre")
.Write();
}
reports.cshtml
En la raz del proyecto va este archivo con el siguiente cdigo:
<!DOCTYPE html>
<html lang="es-pe">
@RenderPage("~/style/header.cshtml")
<body>
<h1>Reportes Grficos</h1>
<form method="post">
<fieldset>
<legend>Reportando</legend>
Seleccione tipo de reporte:
<select name="opcionreporte">
<option value="stock">Stock de productos</option>
<option value="precio">Precio de productos</option>
</select>
<input type="submit" onclick="" value="Obtener Reporte" >
</fieldset>
</form>
@{
if(IsPost)
{
var or = Request["opcionreporte"];
if(or=="stock")
error.cshtml
Este archivo, tambin va dentro de la raz del proyecto.
<!DOCTYPE html>
<html lang="es-pe">
@RenderPage("~/style/header.cshtml")
<body>
<h1>Error 404</h1>
<fieldset>
<legend>Not Found</legend>
<p>Lo sentimos, la pgina solicitada no existe</p>
</fieldset>
@RenderPage("/style/footer.cshtml")
</body>
</html>
web.config
Al igual que el anterior archivo, tambin va dentro de la raz.
Para publicar el sitio creado en internet necesitamos tener un hosting, creamos una cuenta
trial de 30 das gratis (teniendo en cuenta que luego dicha cuenta deber ser eliminada
manualmente antes que los 30 das terminen, para evitar cobros por parte del servidor
hacia ustedes). En el siguiente enlace: http://hosting.parking.ru/webmatrix.aspx
Al final de la publicacin, la herramienta nos dar un Log (archivo que guarda todo tipo de
movimiento, indicando fechas/horas, y tareas efectuadas principalmente, puede ser va
texto plano o mediante algn tipo de formato especial como HTML. NO confundir con meta-
dato)
Recursos Extras
http://www.facebook.com/UPAO.net
http://rdiazconcha.com
W3Schools http://www.w3schools.com/aspnet/razor_intro.asp
http://www.mikepope.com/blog/displayblog.aspx?category=webmatrix
Gracias por su paciencia, dedicacin y esfuerzo, espero que hayan aprendido cmo se
trabaja una aplicacin en la web, ahora es su turno de compartir el conocimiento en su
grupo de amigos.
Internet es mucho ms que ratos de juego y ocio en las redes sociales, stas mismas tienen
gran material de cientos, miles y millones de cibernautas que tambin van compartiendo
conocimiento, el punto clave es buscar y de preferencia en ingls, si desconoces el ingls, no
hay problema, en internet tambin se aprende idiomas.
Siempre busquen, investiguen ms all de lo que las clases pueden llegar, no veamos la
competencia entre nuestros entornos, la verdadera competencia radica en superarse a uno
mismo da a da.
Saludos!