Introducción a la programación web de ASP.NET mediante la sintaxis Razor (Visual Basic)

Por Tom FitzMacken

Este artículo le ofrece una introducción a la programación con ASP.NET Web Pages usando la sintaxis Razor y Visual Basic. ASP.NET es la tecnología de Microsoft para ejecutar páginas web dinámicas en servidores web.

Aprenderá lo siguiente:

  • Las 8 mejores recomendaciones de programación para iniciarse en la programación de ASP.NET Web Pages usando la sintaxis Razor.
  • Conceptos básicos de programación que necesitará.
  • En qué consiste el código de servidor ASP.NET y la sintaxis Razor.

Versiones de software

  • ASP.NET Web Pages (Razor) 3

Este tutorial también funciona con ASP.NET Web Pages 2.

La mayoría de los ejemplos de uso de ASP.NET Web Pages con sintaxis Razor usan C#. Pero la sintaxis Razor también es compatible con Visual Basic. Para programar una página web ASP.NET en Visual Basic, se crea una página web con una extensión de nombre de archivo .vbhtml y después se agrega código de Visual Basic. Este artículo le ofrece una introducción general al trabajo con el lenguaje y la sintaxis de Visual Basic para crear páginas web ASP.NET.

Nota:

Las plantillas de sitio web predeterminadas para Microsoft WebMatrix (Bakery, Photo Gallery y Starter Site, etc.) están disponibles en las versiones de C# y Visual Basic. Puede instalar las plantillas de Visual Basic como paquetes NuGet. Las plantillas del sitio web se instalan en la carpeta raíz de su sitio, en una carpeta denominada Microsoft Templates.

Las 8 mejores recomendaciones de programación

En esta sección se enumeran algunas recomendaciones que es absolutamente necesario que conozca cuando empiece a escribir código de servidor ASP.NET usando la sintaxis Razor.

1. Se agrega código a una página mediante el carácter @

El carácter @ inicia expresiones insertadas, bloques de instrucción única y bloques de varias instrucciones:

<!-- Single statement blocks  -->
@Code  Dim total = 7  End Code
@Code  Dim myMessage = "Hello World" End Code

<!-- Inline expressions -->
<p>The value of your account is: @total </p>
<p>The value of myMessage is: @myMessage</p>        
    
<!-- Multi-statement block -->    
@Code 
    Dim greeting = "Welcome to our site!"
    Dim weekDay = DateTime.Now.DayOfWeek
    Dim greetingMessage = greeting & " Today is: " & weekDay.ToString()
End Code 
<p>The greeting is: @greetingMessage</p>

Resultado que se muestra en un explorador:

Razor-Img1

Sugerencia

Codificación HTML

Al mostrar contenido en una página con el carácter @, como en los ejemplos anteriores, ASP.NET codifica la salida en HTML. Esto reemplaza los caracteres HTML reservados (como < y > y &) por códigos que permiten que los caracteres se muestren como caracteres en una página web en lugar de interpretarse como etiquetas o entidades HTML. Sin codificación HTML, es posible que la salida del código del servidor no se muestre correctamente y podría exponer una página a riesgos de seguridad.

Si el objetivo es generar un marcado HTML que represente etiquetas como marcado (por ejemplo, <p></p> para un párrafo o <em></em> para resaltar texto), consulte la sección Combinación de texto, marcado y código en bloques de código más adelante en este artículo.

Puede leer más sobre la codificación HTML en Trabajar con formularios HTML en sitios de ASP.NET Web Forms.

2. Los bloques de código se delimitan con Code...End Code

Un bloque de código incluye una o más instrucciones de código y se delimita con las palabras clave Code y End Code. Coloque la palabra clave de apertura Code inmediatamente después del carácter @ (no puede haber espacios en blanco entre ellos).

<!-- Single statement block.  -->
@Code
    Dim theMonth = DateTime.Now.Month
End Code
<p>The numeric value of the current month: @theMonth</p>

<!-- Multi-statement block. -->
@Code
    Dim outsideTemp = 79
    Dim weatherMessage = "Hello, it is " & outsideTemp & " degrees."
End Code 
<p>Today's weather: @weatherMessage</p>

Resultado que se muestra en un explorador:

Razor-Img2

3. Dentro de un bloque, se termina cada instrucción de código con un salto de línea

En un bloque de código de Visual Basic, cada instrucción termina con un salto de línea. (Más adelante en el artículo verá una forma de encapsular una instrucción de código larga en varias líneas si es necesario).

<!-- Single statement block. -->
@Code
    Dim theMonth = DateTime.Now.Month
End Code

<!-- Multi-statement block. -->
@Code
    Dim outsideTemp = 79
    Dim weatherMessage = "Hello, it is " & outsideTemp & " degrees."
End Code 

<!-- An inline expression, so no line break needed. -->
<p>Today's weather: @weatherMessage</p>

4. Las variables se usan para almacenar valores

Puede almacenar valores en una variable, incluyendo cadenas, números y fechas, etc. Se crea una nueva variable usando la palabra clave Dim. Puede insertar valores de variable directamente en una página mediante @.

<!-- Storing a string -->
@Code 
    Dim welcomeMessage = "Welcome, new members!"
End Code
<p>@welcomeMessage</p>
    
<!-- Storing a date -->
@Code 
    Dim year = DateTime.Now.Year
End Code

<!-- Displaying a variable -->
<p>Welcome to our new members who joined in @year!</p>

Resultado que se muestra en un explorador:

Razor-Img3

5. Debe poner los valores literales de las cadenas entre comillas dobles

Una cadena es una secuencia de caracteres que se trata como texto. Para especificar una cadena, debe incluirla entre comillas dobles:

@Code 
    Dim myString = "This is a string literal"
End Code

Para insertar comillas dobles dentro de un valor de cadena, inserte dos caracteres de comillas dobles. Si quiere que el carácter de comillas dobles aparezca una vez en la salida de la página, introdúzcalo como "" dentro de la cadena entrecomillada, y si quiere que aparezca dos veces, introdúzcalo como """" dentro de la cadena entrecomillada.

<!-- Embedding double quotation marks in a string -->
@Code 
    Dim myQuote = "The person said: ""Hello, today is Monday."""
End Code
<p>@myQuote</p>

Resultado que se muestra en un explorador:

Razor-Img4

6. El código de Visual Basic no distingue entre mayúsculas y minúsculas

El lenguaje Visual Basic no distingue entre mayúsculas y minúsculas. Las palabras clave de programación (como Dim, If y True) y los nombres de variables (como myString o subTotal) pueden escribirse como se prefiera.

Las siguientes líneas de código asignan un valor a la variable lastname usando un nombre en minúsculas, y después envían el valor de la variable a la página usando un nombre en mayúsculas.

@Code 
    Dim lastName = "Smith"
    ' Keywords like dim are also not case sensitive.
    DIM someNumber = 7
End Code
<p>The value of the <code>lastName</code> variable is: @LASTNAME</p>

Resultado que se muestra en un explorador:

vb-syntax-5

7. Gran parte de su codificación implica trabajar con objetos

Un objeto representa una cosa con la que se puede programar: una página, un cuadro de texto, un archivo, una imagen, una solicitud web, un mensaje de correo electrónico, un registro de cliente (fila de la base de datos), etc. Los objetos tienen propiedades que describen sus características: un objeto de cuadro de texto tiene una propiedad Text, un objeto de solicitud tiene una propiedad Url, un mensaje de correo electrónico tiene una propiedad From y un objeto de cliente tiene una propiedad FirstName. Los objetos también tienen métodos que son los "verbos" que pueden realizar. Algunos ejemplos incluyen el método Save de un objeto de archivo, el método Rotate de un objeto de imagen y el método Send de un objeto de correo electrónico.

A menudo trabajará con el objeto Request, que le proporciona información como los valores de los campos de formulario de la página (cuadros de texto, etc.), qué tipo de explorador realizó la solicitud, la URL de la página, la identidad del usuario, etc. Este ejemplo muestra cómo acceder a las propiedades del objeto Request y cómo llamar al método MapPath del objeto Request, que le proporciona la ruta absoluta de la página en el servidor:

<table border="1"> 
    <tr>
        <td>Requested URL</td>
        <td>Relative Path</td>
        <td>Full Path</td>
        <td>HTTP Request Type</td>
    </tr>
    <tr>
        <td>@Request.Url</td>
        <td>@Request.FilePath</td>
        <td>@Request.MapPath(Request.FilePath)</td>
        <td>@Request.RequestType</td>
    </tr>
</table>

Resultado que se muestra en un explorador:

Razor-Img5

8. Puede escribir código que tome decisiones

Una característica clave de las páginas web dinámicas es que pueden determinar qué hacer en función de las condiciones. La forma más habitual de hacerlo es con la instrucción If (y la instrucción opcional Else).

@Code
   Dim result = ""
   If IsPost Then
      result = "This page was posted using the Submit button."
   Else
      result = "This was the first request for this page."
   End If
End Code
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Write Code that Makes Decisions</title>
    </head>
<body>
    
    <form method="POST" action="" >
        <input type="Submit" name="Submit" value="Submit"/>
        <p>@result</p>
    </form>
    
</body>
</html>

Las instrucciones If IsPost son una forma abreviada de escribir If IsPost = True. Junto con las instrucciones If, existen diversas formas de probar condiciones, repetir bloques de código, etc., que se describen más adelante en este artículo.

El resultado se muestra en un explorador (tras hacer clic en Enviar):

Razor-Img6

Sugerencia

Métodos HTTP GET y POST y la propiedad IsPost

El protocolo utilizado para las páginas web (HTTP) es compatible con un número muy limitado de métodos ("verbos") que se usan para hacer solicitudes al servidor. Los dos más comunes son GET, que se usa para leer una página, y POST, que se usa para enviar una página. En general, la primera vez que un usuario solicita una página, se pide usando GET. Si el usuario rellena un formulario y después hace clic en Enviar, el explorador realiza una solicitud POST al servidor.

En programación web, a menudo es útil saber si una página se está solicitando como GET o como POST para saber cómo procesarla. En ASP.NET Web Pages, puede usar la propiedad IsPost para ver si una solicitud es GET o POST. Si la solicitud es POST, la propiedad IsPost devolverá true, y podrá hacer cosas como leer los valores de los cuadros de texto de un formulario. Muchos de los ejemplos que verá muestran cómo procesar la página de forma diferente en función del valor de IsPost.

Un ejemplo de código sencillo

Este procedimiento le muestra cómo crear una página que ilustre las técnicas básicas de programación. En el ejemplo, se crea una página que permite a los usuarios escribir dos números y, a continuación, se agregan y se muestra el resultado.

  1. En su editor, cree un nuevo archivo y nómbrelo AddNumbers.vbhtml.

  2. Copie el código y el marcado siguientes en la página, reemplazando todo lo que ya esté en la página.

    @Code
        Dim total = 0
        Dim totalMessage = ""
        if IsPost Then
            ' Retrieve the numbers that the user entered.
            Dim num1 = Request("text1")
            Dim num2 = Request("text2")
            ' Convert the entered strings into integers numbers and add.
            total = num1.AsInt() + num2.AsInt()
            totalMessage = "Total = " & total
        End If
    End Code
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8" />
            <title>Adding Numbers</title>
            <style type="text/css">
                body {background-color: beige; font-family: Verdana, Ariel; 
                    margin: 50px;
                    }
                form {padding: 10px; border-style: solid; width: 250px;}
            </style>
        </head>
    <body>
        <p>Enter two whole numbers and click <strong>Add</strong> to display the result.</p>
        <p></p>
        <form action="" method="post">
        <p><label for="text1">First Number:</label>
        <input type="text" name="text1" />
        </p>
        <p><label for="text2">Second Number:</label>
        <input type="text" name="text2" />
        </p>
        <p><input type="submit" value="Add" /></p>
        </form>
        <p>@totalMessage</p>
    </body>
    </html>
    

    Estas son algunas cosas que debe tener en cuenta:

    • El carácter @ inicia el primer bloque de código de la página y precede a la variable totalMessage insertada cerca de la parte inferior.
    • El bloque de la parte superior de la página está delimitado por Code...End Code.
    • Las variables total, num1, num2 y totalMessage almacenan varios números y una cadena.
    • El valor de la cadena literal asignada a la variable totalMessage está entre comillas dobles.
    • Como el código de Visual Basic no distingue entre mayúsculas y minúsculas, cuando se usa la variable totalMessage cerca de la parte inferior de la página, su nombre solo tiene que coincidir con la ortografía de la declaración de la variable en la parte superior de la página. El uso de mayúsculas y minúsculas no importa.
    • La expresión num1.AsInt() + num2.AsInt() muestra cómo trabajar con objetos y métodos. El método AsInt de cada variable convierte la cadena escrita por un usuario en un número entero que se puede agregar.
    • La etiqueta <form> incluye un atributo method="post". Esto especifica que cuando el usuario haga clic en Añadir, la página se enviará al servidor usando el método HTTP POST. Cuando se envía la página, el código If IsPost se evalúa como true y el código condicional se ejecuta, mostrando el resultado de agregar los números.
  3. Guarde la página y ejecútela en un explorador. (Asegúrese de que la página está seleccionada en el área de trabajo Archivos antes de ejecutarla) Escriba dos números enteros y después haga clic en el botón Añadir.

    Razor-Img7

Lenguaje y sintaxis de Visual Basic

Anteriormente ha visto un ejemplo básico de cómo crear una página web ASP.NET y cómo puede agregar código de servidor al marcado HTML. Aquí aprenderá los fundamentos del uso de Visual Basic para escribir código de servidor ASP.NET usando la sintaxis Razor, es decir, las reglas del lenguaje de programación.

Si tiene experiencia con la programación (especialmente si ha usado C, C++, C#, Visual Basic o JavaScript), gran parte de lo que lea aquí le resultará familiar. Probablemente solo tendrá que familiarizarse con la forma en que el código WebMatrix se agrega al marcado en archivos .vbhtml.

Combinación de texto, marcas y código en bloques de código

En los bloques de código del servidor, a menudo querrá generar texto y marcado en la página. Si un bloque de código del servidor contiene texto que no es código y que, en cambio, debería representarse tal cual, ASP.NET debe ser capaz de distinguir ese texto del código. Hay varias maneras de hacerlo.

  • Encierre el texto en un elemento de bloque HTML como <p></p> o <em></em>:

    @If IsPost Then
        ' This line has all content between matched <p> tags.
        @<p>Hello, the time is @DateTime.Now and this page is a postback!</p> 
    Else
        ' All content between matched tags, followed by server code.
        @<p>Hello, <em>Stranger!</em> today is: </p> @DateTime.Now
    End If
    

    El elemento HTML puede incluir texto, elementos HTML adicionales y expresiones de código de servidor. Cuando ASP.NET ve la etiqueta HTML de apertura (por ejemplo, <p>), representa todo el elemento y su contenido tal cual al explorador (y resuelve las expresiones del código del servidor).

  • Use el operador @: o el elemento <text>. El @: genera una sola línea de contenido que contiene texto sin formato o etiquetas HTML no coincidentes; el elemento <text> incluye varias líneas para la salida. Estas opciones son útiles cuando no se quiere representar un elemento HTML como parte de la salida.

    @If IsPost Then
        ' Plain text followed by an unmatched HTML tag and server code.
        @:The time is: <br /> @DateTime.Now
        ' Server code and then plain text, matched tags, and more text.
        @DateTime.Now @:is the <em>current</em> time.
    End If
    

    El siguiente ejemplo repite el anterior pero usando un único par de etiquetas <text> para encerrar el texto a representar.

    @If IsPost Then
        @<text>
        The time is: <br /> @DateTime.Now
        @DateTime.Now is the <em>current</em> time.
        </text>
    End If
    

    En el siguiente ejemplo, las etiquetas <text> y </text> encierran tres líneas, todas las cuales tienen algo de texto no contenido y etiquetas HTML no emparejadas (<br />), junto con código del servidor y etiquetas HTML emparejadas. De nuevo, también podría preceder cada línea individualmente con el operador @:; cualquiera de las dos formas funciona.

    @Code
        dim minTemp = 75 
        @<text>It is the month of @DateTime.Now.ToString("MMMM"), and  
        it's a <em>great</em> day! <p>You can go swimming if it's at 
        least @minTemp degrees.</p></text>
    End Code
    

    Nota:

    Cuando genera texto como se muestra en esta sección (usando un elemento HTML, el operador @: o el elemento <text>), ASP.NET no codifica el texto en HTML. (Como se ha indicado anteriormente, ASP.NET sí codifica la salida de las expresiones de código de servidor y los bloques de código de servidor que van precedidos de @, excepto en los casos especiales indicados en esta sección).

Espacio en blanco

Los espacios extra en una instrucción (y fuera de una cadena literal) no afectan a la instrucción:

@Code Dim personName =    "Smith"    End Code

Dividir instrucciones largas en varias líneas

Puede dividir una instrucción de código larga en varias líneas usando el carácter de subrayado _ (que en Visual Basic se denomina carácter de continuación) después de cada línea de código. Para pasar una instrucción a la línea siguiente, al final de la línea agregue un espacio y después el carácter de continuación. Continúe con las instrucciones en la línea siguiente. Puede encapsular instrucciones en tantas líneas como necesite para mejorar la legibilidad. Las siguientes instrucciones son las mismas:

@Code
    Dim familyName _
    =  "Smith" 
End Code

@Code
    Dim _
    theName _
    = _
    "Smith"
End Code

Sin embargo, no puede encapsular una línea en medio de un literal de cadena. El ejemplo siguiente no funciona:

@Code 
    ' Doesn't work.
    Dim test = "This is a long _
      string"
End Code

Para combinar una cadena larga que encapsula varias líneas como el código anterior, tendría que usar el operador de concatenación (&), que verá más adelante en este artículo.

Comentarios en el código

Los comentarios le permiten dejar notas para usted o para otras personas. Los comentarios de sintaxis Razor tienen el prefijo @* y terminan con *@.

@* A single-line comment is added like this example. *@
    
@*
    This is a multiline code comment. 
    It can continue for any number of lines.
*@

Dentro de los bloques de código puede usar los comentarios de sintaxis Razor, o puede usar el carácter de comentario ordinario de Visual Basic, que es una comilla simple (') antepuesta a cada línea.

@Code
    ' You can make comments in blocks by just using ' before each line.
End Code
    
@Code
    ' There is no multi-line comment character in Visual Basic. 
    ' You use a ' before each line you want to comment. 
End Code

Variables

Una variable es un objeto con nombre que se usa para almacenar datos. Puede dar cualquier nombre a las variables, pero el nombre debe empezar por un carácter alfabético y no puede contener espacios en blanco ni caracteres reservados. En Visual Basic, como ha visto antes, el uso de mayúsculas y minúsculas en el nombre de una variable no importa.

Variables y tipos de datos

Una variable puede tener un tipo de datos específico, que indica qué tipo de datos se almacenan en la variable. Puede tener variables de cadena que almacenen valores de cadena (como "Hola mundo"), variables de número entero que almacenen valores de número entero (como 3 o 79) y variables de fecha que almacenen valores de fecha en diversos formatos (como 4/12/2012 o marzo de 2009). Y hay muchos otros tipos de datos que puede usar.

Sin embargo, no tiene que especificar un tipo para una variable. En la mayoría de los casos ASP.NET puede averiguar el tipo basándose en cómo se están usando los datos de la variable. (Ocasionalmente debe especificar un tipo; verá ejemplos en los que es así).

Para declarar una variable sin especificar un tipo, use Dim más el nombre de la variable (por ejemplo, Dim myVar). Para declarar una variable con un tipo, use Dim más el nombre de la variable, seguido de As y después el nombre del tipo (por ejemplo, Dim myVar As String).

@Code
    ' Assigning a string to a variable.
    Dim greeting = "Welcome" 
    
    ' Assigning a number to a variable.
    Dim theCount = 3
    
    ' Assigning an expression to a variable.
    Dim monthlyTotal = theCount + 5
    
    ' Assigning a date value to a variable.
    Dim today = DateTime.Today
    
    ' Assigning the current page's URL to a variable.
    Dim myPath = Request.Url
    
    ' Declaring variables using explicit data types.
    Dim name as String = "Joe"
    Dim count as Integer = 5
    Dim tomorrow as DateTime = DateTime.Now.AddDays(1)
End Code

El siguiente ejemplo muestra algunas expresiones insertadas que usan las variables en una página web.

@Code
    ' Embedding the value of a variable into HTML markup.
    ' Precede the markup with @ because we are in a code block.
    @<p>@greeting, friends!</p>
End Code

<!-- Using a variable with an inline expression in HTML. --> 
<p>The predicted annual total is: @( monthlyTotal * 12)</p>

<!--  Displaying the page URL with a variable. --> 
<p>The URL to this page is:  @myPath</p>

Resultado que se muestra en un explorador:

Razor-Img9

Conversión y comprobación de tipos de datos

Aunque ASP.NET normalmente puede determinar un tipo de dato automáticamente, a veces no puede. Por lo tanto, puede que necesite ayudar a ASP.NET realizando una conversión explícita. Aunque no tenga que convertir tipos, a veces es útil hacer pruebas para ver con qué tipo de datos puede estar trabajando.

El caso más común es que tenga que convertir una cadena a otro tipo, como a un número entero o a una fecha. El siguiente ejemplo muestra un caso típico en el que debe convertir una cadena en un número.

@Code
    Dim total = 0
    Dim totalMessage = ""
    if IsPost Then
        ' Retrieve the numbers that the user entered.
        Dim num1 = Request("text1")
        Dim num2 = Request("text2")
        ' Convert the entered strings into integers numbers and add.
        total = num1.AsInt() + num2.AsInt()
        totalMessage = "Total = " & total
    End If
End Code

Por regla general, las entradas de los usuarios le llegan en forma de cadenas. Aunque haya solicitado al usuario que escriba un número, y aunque haya introducido un dígito, cuando se envía la entrada del usuario y usted la lee en código, los datos están en formato de cadena. Por lo tanto, debe convertir la cadena en un número. En el ejemplo, si intenta realizar una operación aritmética sobre los valores sin convertirlos, se produce el siguiente error, porque ASP.NET no puede agregar dos cadenas:

Cannot implicitly convert type 'string' to 'int'.

Para convertir los valores a enteros, se llama al método AsInt. Si la conversión tiene éxito, podrá agregar los números.

En la tabla siguiente se describen algunos métodos habituales de conversión y comprobación de variables.

Método

Descripción

Los


AsInt(), IsInt()

Convierte una cadena que representa un número completo (como "593") en un número entero.

Dim myIntNumber = 0
Dim myStringNum = "539"
If myStringNum.IsInt() Then
    myIntNumber = myStringNum.AsInt()
End If

AsBool(), IsBool()

Convierte una cadena como "verdadero" o "falso" en una de tipo booleano.

Dim myStringBool = "True"
Dim myVar = myStringBool.AsBool()

AsFloat(), IsFloat()

Convierte una cadena que tiene un valor decimal como "1,3" o "7,439" en un número de coma flotante.

Dim myStringFloat = "41.432895"
Dim myFloatNum = myStringFloat.AsFloat()

AsDecimal(), IsDecimal()

Convierte una cadena que tiene un valor decimal como "1,3" o "7,439" en un número decimal. (En ASP.NET, un número decimal es más preciso que un número en coma flotante).

Dim myStringDec = "10317.425"
Dim myDecNum = myStringDec.AsDecimal()

AsDateTime(), IsDateTime()

Convierte una cadena que representa un valor de fecha y hora al tipo ASP.NET DateTime.

Dim myDateString = "12/27/2012"
Dim newDate = myDateString.AsDateTime()

ToString()

Convierte cualquier otro tipo de datos en una cadena.

Dim num1 As Integer = 17
Dim num2 As Integer = 76

' myString is set to 1776
Dim myString as String = num1.ToString() & _
    num2.ToString()

Operadores

Un operador es una palabra clave o un carácter que indica a ASP.NET qué tipo de comando debe ejecutar en una expresión. Visual Basic es compatible con muchos operadores, pero solo necesitará reconocer unos pocos para iniciarse en el desarrollo de páginas web ASP.NET. La siguiente tabla resume los operadores más comunes.

Operador

Descripción

Ejemplos


+ - * /

Operadores matemáticos usados en expresiones numéricas.

@(5 + 13)

Dim netWorth = 150000
Dim newTotal = netWorth * 2
@(newTotal / 2)

=

Asignación e igualdad. Dependiendo del contexto, asigna el valor de la parte derecha de una instrucción al objeto de la parte izquierda, o comprueba la igualdad de los valores.

Dim age = 17

Dim income = Request("AnnualIncome")

<>

Desigualdad. Devuelve True si los valores no son iguales.

Dim theNum = 13
If theNum <> 15 Then
    ' Do something.
End If

< > <= >=

Menor que, mayor que, menor o igual y mayor o igual.

If 2 < 3 Then
    ' Do something.
End If

Dim currentCount = 12
If currentCount >= 12 Then
    ' Do something.
End If

&

La concatenación, que se usa para unir cadenas.

' The displayed result is "abcdef".
@("abc" & "def")

+= -=

Los operadores de incremento y decremento, que agregan y restan 1 (respectivamente) a una variable.

Dim theCount As Integer = 0
theCount += 1 ' Adds 1 to count

.

Punto. Usado para distinguir objetos y sus propiedades y métodos.

Dim myUrl = Request.Url
Dim count = Request("Count").AsInt()

()

Paréntesis. Se usa para agrupar expresiones, para pasar parámetros a métodos y para acceder a miembros de matrices y colecciones.

@(3 + 7)

@Request.MapPath(Request.FilePath)

Not

No. Invierte un valor verdadero en falso y viceversa. Normalmente se usa como una manera abreviada de probar False (es decir, para no True).

Dim taskCompleted As Boolean = False
' Processing.
If Not taskCompleted Then 
    ' Continue processing
End If

AndAlso OrElse

AND y OR lógicos, que se usan para vincular condiciones entre sí.

Dim myTaskCompleted As Boolean = false
Dim totalCount As Integer = 0          
' Processing.
If (Not myTaskCompleted) AndAlso _
         totalCount < 12 Then 
    ' Continue processing.
End If

Trabajar con rutas de archivos y carpetas en código

A menudo trabajará con rutas de acceso a archivos y carpetas en su código. Este es un ejemplo de estructura de carpetas físicas para un sitio web, ya que podría aparecer en el equipo de desarrollo:

C:\WebSites\MyWebSite default.cshtml datafile.txt \images Logo.jpg \styles Styles.css

Estos son algunos detalles esenciales sobre las direcciones URL y las rutas de acceso:

  • Una dirección URL comienza con un nombre de dominio (http://www.example.com) o un nombre de servidor (http://localhost, http://mycomputer).
  • Una dirección URL corresponde a una ruta de acceso física en un equipo host. Por ejemplo, http://myserver podría corresponder a la carpeta C:\websites\mywebsite en el servidor.
  • Una ruta de acceso virtual es abreviada para representar rutas de acceso en el código sin tener que especificar la ruta de acceso completa. Incluye la parte de una dirección URL que sigue al nombre de dominio o servidor. Al usar rutas de acceso virtuales, puede mover el código a otro dominio o servidor sin tener que actualizar las rutas de acceso.

Este es un ejemplo para ayudarle a comprender las diferencias:

Dirección URL completa http://mycompanyserver/humanresources/CompanyPolicy.htm
Nombre del servidor mycompanyserver
Ruta de acceso virtual /humanresources/CompanyPolicy.htm
Ruta de acceso física C:\mywebsites\humanresources\CompanyPolicy.htm

La raíz virtual es /, al igual que la raíz de la unidad C: es . (Las rutas de acceso a las carpetas virtuales siempre usan barras inclinadas). La ruta de acceso virtual de una carpeta no tiene por qué tener el mismo nombre que la carpeta física; puede ser un alias. (En los servidores de producción, la ruta de acceso virtual rara vez coincide con una ruta física exacta).

Cuando trabaja con archivos y carpetas en código, a veces necesita hacer referencia a la ruta física y a veces a una ruta virtual, dependiendo de los objetos con los que esté trabajando. ASP.NET le ofrece estas herramientas para trabajar con rutas de archivos y carpetas en código: el método Server.MapPath, y el operador ~ y el método Href.

Convertir rutas virtuales en físicas: el método Server.MapPath

El método Server.MapPath convierte una ruta virtual (como /default.cshtml) en una ruta física absoluta (como C:\WebSites\MyWebSiteFolder\default.cshtml). Use este método siempre que necesite una ruta de acceso física completa. Un ejemplo típico es cuando está leyendo o escribiendo un archivo de texto o de imagen en el servidor web.

Normalmente no conoce la ruta física absoluta de su sitio en el servidor de un sitio de hospedaje, por lo que este método puede convertir la ruta que sí conoce (la ruta virtual) en la ruta correspondiente en el servidor por usted. La ruta de acceso virtual se pasa a un archivo o carpeta al método y devuelve la ruta de acceso física:

@Code
    Dim dataFilePath = "~/dataFile.txt"
End Code    

<!-- Displays a physical path C:\Websites\MyWebSite\datafile.txt  --> 
<p>@Server.MapPath(dataFilePath)</p>

Hacer referencia a la raíz virtual: el operador ~ y el método Href

En un archivo .cshtml o .vbhtml, puede hacer referencia a la ruta de acceso raíz virtual usando el operador ~. Esto es muy útil porque puede mover páginas alrededor de un sitio, y los vínculos que contienen a otras páginas no se romperán. También es útil por si alguna vez traslada su sitio web a otra ubicación. Estos son algunos ejemplos:

@Code
    Dim myImagesFolder = "~/images"
    Dim myStyleSheet = "~/styles/StyleSheet.css"       
End Code

Si el sitio web es http://myserver/myapp, así es como ASP.NET tratará estas rutas cuando se ejecute la página:

  • myImagesFolder: http://myserver/myapp/images
  • myStyleSheet : http://myserver/myapp/styles/Stylesheet.css

(En realidad no verá estas rutas como los valores de la variable, pero ASP.NET tratará las rutas como si eso fueran).

Puede usar el operador ~ tanto en el código del servidor (como anteriormente) como en el marcado, como en este caso:

<!-- Examples of using the ~ operator in markup in ASP.NET Web Pages -->

<a href="~/Default">Home</a>
<img src="~/images/MyImages.png" />

En el marcado, se usa el operador ~ para crear rutas de acceso a recursos como archivos de imagen, otras páginas web y archivos CSS. Cuando se ejecuta la página, ASP.NET examina la página (código y marcado) y resuelve todas las referencias de ~ a la ruta de acceso adecuada.

Lógica condicional y bucles

El código del servidor ASP.NET le permite realizar tareas basadas en condiciones y escribir código que repite instrucciones un número determinado de veces, es decir, código que ejecuta un bucle).

Condiciones de prueba

Para probar una condición simple se usa la instrucción If...Then, que devuelve True o False en función de una prueba que especifique:

@Code
    Dim showToday = True
    If showToday Then
        DateTime.Today
    End If
End Code

La palabra clave If inicia un bloque. La prueba real (condición) sigue a la palabra clave If y devuelve verdadero o falso. Las instrucciones If terminan con Then. Las instrucciones que se ejecutarán si la prueba es verdadera están delimitadas por If y End If. Una instrucción If puede incluir un bloque Else que especifique las instrucciones a ejecutar si la condición es falsa:

@Code
    Dim showToday = False
    If showToday Then
        DateTime.Today
    Else
        @<text>Sorry!</text>
    End If
End Code

Si una instrucción If inicia un bloque de código, no tendrá que usar las instrucciones Code...End Code normales para incluir los bloques. Solo tiene que agregar @ al bloque y funcionará. Este enfoque funciona con If así como con otras palabras clave de programación de Visual Basic que van seguidas de bloques de código, incluyendo For, For Each, Do While, etc.

@If showToday Then
    DateTime.Today
Else
    @<text>Sorry!</text>
End If

Puede agregar varias condiciones usando uno o más bloques ElseIf:

@Code
    Dim theBalance = 4.99
    If theBalance = 0 Then
        @<p>You have a zero balance.</p>
    ElseIf theBalance > 0 AndAlso theBalance <= 5 Then
        ' If the balance is above 0 but less than
        ' or equal to $5, display this message.
        @<p>Your balance of $@theBalance is very low.</p>
    Else
        ' For balances greater than $5, display balance.
        @<p>Your balance is: $@theBalance</p>
    End If    
End Code

En este ejemplo, si la primera condición del bloque If no es cierta, se comprueba la condición ElseIf. Si se cumple esa condición, se ejecutan las instrucciones del bloque ElseIf. Si no se cumple ninguna de las condiciones, se ejecutan las instrucciones del bloque Else. Puede agregar cualquier número de bloques ElseIf y después cerrar con un bloque Else como condición "todo lo demás".

Para probar un gran número de condiciones, use un bloque Select Case:

@Code
    Dim weekday = "Wednesday"
    Dim greeting = ""
    
    Select Case weekday
        Case "Monday"
            greeting = "Ok, it's a marvelous Monday."
        Case "Tuesday"
            greeting = "It's a tremendous Tuesday."
        Case "Wednesday"
            greeting = "Wild Wednesday is here!"
        Case Else
            greeting = "It's some other day, oh well."
    End Select
End Code
<p>Since it is @weekday, the message for today is: @greeting</p>

El valor a comprobar se encuentra entre paréntesis (en el ejemplo, la variable día de la semana). Cada prueba individual usa una instrucción Case que enumera un valor. Si el valor de una instrucción Case coincide con el valor de prueba, se ejecuta el código de ese bloque Case.

El resultado de los dos últimos bloques condicionales se muestra en un explorador:

Razor-Img10

Código de bucle

A menudo necesitará ejecutar las mismas instrucciones repetidamente. Para ello, se realiza un bucle. Por ejemplo, a menudo se ejecutan las mismas instrucciones para cada elemento de una colección de datos. Si sabe exactamente cuántas veces quiere usar el bucle, puede usar un bucle For. Este tipo de bucle es especialmente útil para contar hacia arriba o hacia abajo:

@For i = 10 To 20
    @<p>Item #: @i</p>
Next i

El bucle comienza con la palabra clave For, seguida de tres elementos:

  • Inmediatamente después de la instrucción For, se declara una variable de contador (no es necesario usar Dim) y, a continuación, se indica el intervalo, como en i = 10 to 20. Esto significa que la variable i empezará a contar en 10 y continuará hasta llegar a 20 (inclusive).
  • Entre las instrucciones For y Next se encuentra el contenido del bloque. Puede contener una o más instrucciones de código que se ejecutan con cada bucle.
  • Las instrucciones Next i finalizan el bucle. Incrementa el contador e inicia la siguiente iteración del bucle.

La línea de código entre las líneas For y Next contiene el código que se ejecuta en cada iteración del bucle. El marcado crea un nuevo párrafo (elemento <p>) cada vez y agrega una línea a la salida, mostrando el valor de i (el contador). Cuando ejecute esta página, el ejemplo creará 11 líneas mostrando la salida, con el texto de cada línea indicando el número de elemento.

Razor-Img11

Si trabaja con una colección o matriz, suele usar un bucle For Each. Una colección es un grupo de objetos similares, y el bucle For Each le permite realizar una tarea en cada elemento de la colección. Este tipo de bucle es conveniente para las colecciones, porque a diferencia de un bucle For, no tiene que incrementar el contador o establecer un límite. En su lugar, el código del bucle For Each simplemente procede a través de la colección hasta que termina.

Este ejemplo devuelve los elementos de la colección Request.ServerVariables (que contiene información sobre su servidor web). Usa un bucle For Each para mostrar el nombre de cada elemento creando un nuevo elemento <li> en una lista con viñetas HTML.

<ul>
@For Each myItem In Request.ServerVariables
    @<li>@myItem</li>
Next myItem
</ul>

La palabra clave For Each va seguida de una variable que representa un único elemento de la colección (en el ejemplo, myItem), seguida de la palabra clave In, seguida de la colección que quiere recorrer en bucle. En el cuerpo del bucle For Each, puede acceder al elemento actual usando la variable que declaró anteriormente.

Razor-Img12

Para crear un bucle de propósito más general, use las instrucciones Do While:

@Code
    Dim countNum = 0
    Do While countNum < 50
        countNum += 1
        @<p>Line #@countNum: </p>
    Loop
End Code

Este bucle comienza con la palabra clave Do While, seguida de una condición, seguida del bloque a repetir. Los bucles suelen incrementar (agregar a) o disminuir (restar de) una variable o un objeto que se usa para contar. En el ejemplo, el operador += agrega 1 al valor de una variable cada vez que se ejecuta el bucle. (Para disminuir una variable en un bucle que cuenta hacia abajo, usaría el operador decremento -=).

Objetos y colecciones

Casi todo en un sitio web ASP.NET es un objeto, incluida la propia página web. En esta sección se tratan algunos objetos importantes con los que trabajará frecuentemente en su código.

Objetos de página

El objeto más básico de ASP.NET es la página. Puede acceder directamente a las propiedades del objeto página sin necesidad de ningún objeto calificador. El siguiente código obtiene la ruta de acceso al archivo de la página, usando el objeto Request de la página:

@Code
    Dim path = Request.FilePath
End Code

Puede usar las propiedades del objeto Page para obtener mucha información, como por ejemplo:

  • Request. Como ya ha visto, se trata de una recopilación de información sobre la solicitud actual, incluido el tipo de explorador que ha realizado la solicitud, la URL de la página, la identidad del usuario, etc.

  • Response. Se trata de una recopilación de información sobre la respuesta (página) que se enviará al explorador cuando el código del servidor haya terminado de ejecutarse. Por ejemplo, puede usar esta propiedad para escribir información en la respuesta.

    @Code
        ' Access the page's Request object to retrieve the URL.
        Dim pageUrl = Request.Url
    End Code
        <a href="@pageUrl">My page</a>
    

Objetos de colección (matrices y diccionarios)

Una colección es un grupo de objetos del mismo tipo, como una colección de objetos Customer de una base de datos. ASP.NET contiene muchas colecciones incorporadas, como la colección Request.Files.

A menudo trabajará con datos en colecciones. Dos tipos de colección comunes son la matriz y el diccionario. Una matriz es útil cuando se quiere almacenar una colección de elementos similares pero no se quiere crear una variable separada para contener cada elemento:

<h3>Team Members</h3>
@Code
    Dim teamMembers() As String = {"Matt", "Joanne", "Robert", "Nancy"}
    For Each name In teamMembers
        @<p>@name</p>
    Next name
End Code

Con las matrices, se declara un tipo de datos específico, como String, Integer o DateTime. Para indicar que la variable puede contener una matriz, se agregan paréntesis al nombre de la variable en la declaración (como Dim myVar() As String). Puede acceder a los elementos de una matriz usando su posición (índice) o usando las instrucciones For Each. Los índices de las matrices se basan en cero, es decir, el primer elemento está en la posición 0, el segundo elemento en la posición 1, y así sucesivamente.

@Code
    Dim teamMembers() As String = {"Matt", "Joanne", "Robert", "Nancy"}
    @<p>The number of names in the teamMembers array: @teamMembers.Length </p>
    @<p>Robert is now in position: @Array.IndexOf(teamMembers, "Robert")</p>
    @<p>The array item at position 2 (zero-based) is @teamMembers(2)</p>
    @<h3>Current order of team members in the list</h3>
    For Each name In teamMembers
        @<p>@name</p>
    Next name
    @<h3>Reversed order of team members in the list</h3>
    Array.Reverse(teamMembers)
    For Each reversedItem In teamMembers
        @<p>@reversedItem</p>
    Next reversedItem
End Code

Puede determinar el número de elementos de una matriz obteniendo su propiedad Length. Para obtener la posición de un elemento concreto en la matriz (es decir, para buscar en la matriz), use el método Array.IndexOf. También puede hacer cosas como invertir el contenido de una matriz (el método Array.Reverse) u ordenar el contenido (el método Array.Sort).

La salida del código de la matriz de cadenas mostrada en un explorador:

Razor-Img13

Un diccionario es una colección de pares clave/valor, donde usted proporciona la clave (o nombre) para establecer o recuperar el valor correspondiente:

@Code
    Dim myScores = New Dictionary(Of String, Integer)()
    myScores.Add("test1", 71)
    myScores.Add("test2", 82)
    myScores.Add("test3", 100)
    myScores.Add("test4", 59)
End Code
<p>My score on test 3 is: @myScores("test3")%</p>
@Code 
    myScores("test4") = 79
End Code
<p>My corrected score on test 4 is: @myScores("test4")%</p>

Para crear un diccionario, use la palabra clave New para indicar que está creando un nuevo objeto Dictionary. Puede asignar un diccionario a una variable usando la palabra clave Dim. Se indican los tipos de datos de los elementos del diccionario usando paréntesis ( ( ) ). Al final de la declaración, debe agregar otro par de paréntesis, porque en realidad se trata de un método que crea un nuevo diccionario.

Para agregar elementos al diccionario, puede llamar al método Add de la variable del diccionario (myScores en este caso), y después especificar una clave y un valor. Alternativamente, puede usar paréntesis para indicar la clave y hacer una asignación simple, como en el siguiente ejemplo:

@Code
    myScores("test4") = 79
End Code

Para obtener un valor del diccionario, especifique la clave entre paréntesis:

@myScores("test4")

Llamada a métodos con parámetros

Como ha visto antes en este artículo, los objetos con los que se programa tienen métodos. Por ejemplo, un objeto Database puede tener un método Database.Connect. Muchos métodos también tienen uno o más parámetros. Un parámetro es un valor que se pasa a un método para habilitarlo para que finalice su tarea. Por ejemplo, observe una declaración para el método Request.MapPath, que toma tres parámetros:

Public Overridable Function MapPath (virtualPath As String, _
    baseVirtualDir As String, _
    allowCrossAppMapping As Boolean)

Este método devuelve la ruta física en el servidor que corresponde a una ruta virtual especificada. Los tres parámetros del método son virtualPath, baseVirtualDir y allowCrossAppMapping. (Observe que en la declaración, los parámetros se escriben con los tipos de datos que aceptarán). Cuando invoque este método, deberá proporcionar valores para los tres parámetros.

Usando Visual Basic con la sintaxis Razor, tiene dos opciones para pasar parámetros a un método: parámetros de posición o parámetros de nombre. Para llamar a un método usando parámetros posicionales, se pasan los parámetros en un orden estricto que se especifica en la declaración del método. (Normalmente conocerá este orden leyendo la documentación del método). Debe seguir el orden, y no puede omitir ninguno de los parámetros (si es necesario, se pasa una cadena vacía ("") o null para un parámetro posicional para el que no tenga un valor).

El siguiente ejemplo supone que tiene una carpeta llamada scripts en su sitio web. El código llama al método Request.MapPath y pasa los valores de los tres parámetros en el orden correcto. Después muestra la ruta de acceso asignada resultante.

@Code
    ' Pass parameters to a method using positional parameters.
    Dim myPathPositional = Request.MapPath("/scripts", "/", true)
End Code
<p>@myPathPositional</p>

Cuando hay muchos parámetros para un método, puede mantener su código más limpio y legible usando parámetros con nombre. Para llamar a un método usando parámetros con nombre, especifique el nombre del parámetro seguido de := y después proporcione el valor. Una ventaja de los parámetros con nombre es que puede agregarlos en el orden que quiera. (Una desventaja es que la llamada al método no es tan compacta).

En el ejemplo siguiente se llama al mismo método que antes, pero se usan parámetros con nombre para proporcionar los valores:

@Code
    ' Pass parameters to a method using named parameters.
    Dim myPathNamed = Request.MapPath(baseVirtualDir:= "/", allowCrossAppMapping:= true, virtualPath:= "/scripts")
End Code
<p>@myPathNamed</p>

Como puede ver, los parámetros se pasan en un orden diferente. Sin embargo, si ejecuta el ejemplo anterior y este ejemplo, le devolverán el mismo valor.

Control de errores

Instrucciones Try-Catch

A menudo tendrá instrucciones en su código que pueden fallar por razones fuera de su control. Por ejemplo:

  • Si su código intenta abrir, crear, leer o escribir un archivo, pueden producirse todo tipo de errores. Puede que el archivo que quiere no exista, que esté bloqueado, que el código no tenga permisos, etc.
  • Del mismo modo, si su código intenta actualizar registros en una base de datos, puede haber incidencias con los permisos, puede anularse la conexión con la base de datos, los datos a guardar pueden no ser válidos, etc.

En términos de programación, estas situaciones se denominan excepciones. Si su código encuentra una excepción, genera (lanza) un mensaje de error que es, en el mejor de los casos, molesto para los usuarios.

Razor-Img14

En situaciones en las que su código pueda encontrar excepciones, y para evitar mensajes de error de este tipo, puede usar instrucciones Try/Catch. En las instrucciones Try, se ejecuta el código que se está comprobando. En una o más instrucciones Catch, puede buscar errores específicos (tipos específicos de excepciones) que puedan haberse producido. Puede incluir tantas instrucciones Catch como necesite para buscar errores previstos.

Nota:

Se recomienda evitar el uso del método Response.Redirect en instrucciones Try/Catch, ya que puede provocar una excepción en la página.

En el ejemplo siguiente se muestra una página que crea un archivo de texto en la primera solicitud y, a continuación, se muestra un botón que permite al usuario abrir el archivo. El ejemplo usa deliberadamente un nombre de archivo incorrecto para que provoque una excepción. El código incluye instrucciones Catch para dos posibles excepciones: FileNotFoundException, que se produce si el nombre del archivo es incorrecto, y DirectoryNotFoundException, que se produce si ASP.NET ni siquiera puede encontrar la carpeta. (Puede quitar la marca de comentario de una instrucción en el ejemplo para ver cómo se ejecuta cuando todo funciona correctamente).

Si su código no controlara la excepción, vería una página de error como la de la captura de pantalla anterior. Sin embargo, la sección Try/Catch ayuda a evitar que el usuario vea este tipo de errores.

@Code
    Dim dataFilePath = "~/dataFile.txt"
    Dim fileContents = ""
    Dim physicalPath = Server.MapPath(dataFilePath)
    Dim userMessage = "Hello world, the time is " + DateTime.Now
    Dim userErrMsg = ""
    Dim errMsg = ""
    
    If IsPost Then
        ' When the user clicks the "Open File" button and posts
        ' the page, try to open the file.
        Try
            ' This code fails because of faulty path to the file.
            fileContents = File.ReadAllText("c:\batafile.txt")
            
            ' This code works. To eliminate error on page, 
            ' comment the above line of code and uncomment this one.
            ' fileContents = File.ReadAllText(physicalPath)
            
        Catch ex As FileNotFoundException
            ' You can use the exception object for debugging, logging, etc.
            errMsg = ex.Message
            ' Create a friendly error message for users.
            userErrMsg = "The file could not be opened, please contact " _
                & "your system administrator."
                
        Catch ex As DirectoryNotFoundException
            ' Similar to previous exception.
            errMsg = ex.Message
            userErrMsg = "The file could not be opened, please contact " _
                & "your system administrator."
        End Try
    Else
        ' The first time the page is requested, create the text file.
        File.WriteAllText(physicalPath, userMessage)
    End If
End Code
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Try-Catch Statements</title>
    </head>
    <body>  
    <form method="POST" action="" >
      <input type="Submit" name="Submit" value="Open File"/>
    </form>
    
    <p>@fileContents</p>
    <p>@userErrMsg</p>
    
    </body>
</html>

Recursos adicionales

Documentación de referencia