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

por Tom FitzMacken

En este artículo se proporciona una visión general sobre la programación con las Páginas web ASP.NET mediante la sintaxis de 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 sugerencias de programación para empezar a programar ASP.NET Web Pages mediante la sintaxis de Razor.
  • Conceptos básicos de programación que necesitará.
  • De qué se trata el código del servidor ASP.NET y la sintaxis de 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 de Razor usan C#. Pero la sintaxis de Razor también admite Visual Basic. Para programar una página web de ASP.NET en Visual Basic, cree una página web con una extensión de nombre de archivo .vbhtml y agregue código de Visual Basic. En este artículo se proporciona información general sobre cómo trabajar con el lenguaje y la sintaxis de Visual Basic para crear ASP.NET páginas web.

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 de sitio web se instalan en la carpeta raíz del sitio en una carpeta denominada Plantillas de Microsoft.

Las 8 mejores sugerencias de programación

En esta sección se enumeran algunas sugerencias que absolutamente necesita saber a medida que empieza a escribir código de servidor ASP.NET mediante la sintaxis de Razor.

1. Agregar código a una página con 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 HTML o entidades. 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 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 obtener más información sobre la codificación HTML en Trabajar con formularios HTML en ASP.NET sitios de páginas web.

2. Encierra bloques de código con Código... Fin del Código

Un bloque de código incluye una o más instrucciones de código y se incluye 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 manera 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, incluidas cadenas, números y fechas, etc. Cree una variable con la Dim palabra clave . 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. Incluya valores de cadena literal entre comillas dobles

Una cadena es una secuencia de caracteres que se tratan 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 desea que el carácter de comilla doble aparezca una vez en la salida de la página, escríbalo como "" dentro de la cadena entre comillas y, si quiere que aparezca dos veces, escríbalo como """" dentro de la cadena entre comillas.

<!-- 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 mayúsculas de minúsculas

El lenguaje visual Basic no distingue mayúsculas de minúsculas. Las palabras clave de programación (como Dim, Ify ) y Truelos nombres de variable (como myString, o subTotal) se pueden escribir en cualquier caso.

Las siguientes líneas de código asignan un valor a la variable lastname mediante un nombre en minúsculas y, a continuación, generan el valor de la variable en la página con 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 la codificación implica trabajar con objetos

Un objeto representa un elemento con el que 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 base de datos), etc. Los objetos tienen propiedades que describen sus características: un objeto de cuadro de texto tiene una Text propiedad, un objeto de solicitud tiene una Url propiedad, un mensaje de correo electrónico tiene una From propiedad y un objeto de cliente tiene una FirstName propiedad . Los objetos también tienen métodos, que son los "verbos" que pueden ejecutar. Algunos ejemplos incluyen el método de un objeto de archivo Save, el método de un objeto de imagen Rotate, y el método de un objeto de correo electrónico Send.

A menudo trabajará con el Request objeto , que proporciona información como los valores de los campos de formulario en la página (cuadros de texto, etc.), qué tipo de explorador realizó la solicitud, la dirección URL de la página, la identidad del usuario, etc. En este ejemplo se muestra cómo obtener acceso a las propiedades del Request objeto y cómo llamar al MapPath método del Request objeto , que proporciona la ruta de acceso 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 puede determinar qué hacer en función de las condiciones. La manera más común de hacerlo es con la If instrucción (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>

La instrucción If IsPost es una forma abreviada de escribir If IsPost = True. Junto con If las instrucciones , hay varias maneras de probar condiciones, repetir bloques de código, etc., que se describen más adelante en este artículo.

Resultado que se muestra en un explorador (después de hacer clic en Enviar):

Razor-Img6

Sugerencia

Métodos HTTP GET y POST y la propiedad IsPost

El protocolo usado para páginas web (HTTP) admite un número muy limitado de métodos ("verbos") que se usan para realizar 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, la página se solicita mediante GET. Si el usuario rellena un formulario y, a continuación, hace clic en Enviar, el explorador realiza una solicitud POST al servidor.

En la programación web, a menudo resulta útil saber si se solicita una página como GET o como POST para que sepa cómo procesar la página. En ASP.NET Páginas web, puede usar la IsPost propiedad para ver si una solicitud es GET o POST. Si la solicitud es POST, la IsPost propiedad devolverá "true", y podrá, por ejemplo, leer los valores de los cuadros de texto de un formulario. Muchos 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 muestra cómo crear una página que muestre técnicas de programación básicas. 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 el editor, cree un nuevo archivo y asígnele el nombre 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 totalMessage variable incrustada cerca de la parte inferior.
    • El bloque en la parte superior de la página está delimitado por Code...End Code.
    • Las variables total, num1, num2y totalMessage almacenan varios números y una cadena.
    • El valor de cadena literal asignado a la totalMessage variable está entre comillas dobles.
    • Dado que el código de Visual Basic no distingue mayúsculas de minúsculas, cuando la totalMessage variable se usa cerca de la parte inferior de la página, su nombre solo debe coincidir con la ortografía de la declaración de 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 AsInt método de cada variable convierte la cadena especificada por un usuario en un número entero (un entero) que se puede agregar.
    • La <form> etiqueta incluye un method="post" atributo . Esto especifica que cuando el usuario hace clic en Agregar, la página se enviará al servidor mediante 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útelo 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, a continuación, haga clic en el botón Agregar .

    Razor-Img7

Lenguaje y sintaxis de Visual Basic

Anteriormente vio un ejemplo básico de cómo crear una página web de ASP.NET y cómo puede agregar código de servidor al marcado HTML. Aquí aprenderá los conceptos básicos del uso de Visual Basic para escribir código de servidor ASP.NET mediante la sintaxis de 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 ha leído aquí será familiar. Probablemente deba familiarizarse solo con la forma en que se agrega código WebMatrix al marcado en archivos .vbhtml .

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

En los bloques de código del servidor, a menudo querrá generar texto y etiquetas en la página. Si un bloque de código de servidor contiene texto que no es código y que, en su lugar, debe representarse tal como está, ASP.NET debe poder distinguir ese texto del código. Hay varias maneras de hacerlo.

  • Incluya 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 como está en el explorador (y resuelve las expresiones de código de servidor).

  • Use el @: operador o el <text> elemento . El @: genera una sola línea de contenido que contiene texto sin formato o etiquetas HTML no coincidentes; el elemento <text> abarca varias líneas para la salida. Estas opciones son útiles cuando no desea 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
    

    En el ejemplo siguiente se repite el ejemplo anterior, pero se usa un único par de <text> etiquetas para incluir el texto que se va 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 ejemplo siguiente, las etiquetas <text> y </text> encierran tres líneas, todas las cuales tienen algún texto sin contener y etiquetas HTML no coincidentes (<br />), junto con código de servidor y etiquetas HTML coincidentes. De nuevo, también podría preceder cada línea individualmente con el @: operador; en cualquier caso, 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 se genera texto como se muestra en esta sección , mediante un elemento HTML, el @: operador o el <text> elemento , ASP.NET no codifica la salida en HTML. (Como se indicó anteriormente, ASP.NET codifica la salida de expresiones de código de servidor y bloques de código de servidor precedidos por @, excepto en los casos especiales indicados en esta sección).

Espacio en blanco

Los espacios adicionales 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 mediante 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 interrumpir una instrucción en la línea siguiente, al final de la línea, agregue un espacio y, a continuación, el carácter de continuación. Continúe la declaración en la línea siguiente. Puede encapsular instrucciones en tantas líneas como necesite para mejorar la legibilidad. Las siguientes declaraciones son iguales:

@Code
    Dim familyName _
    =  "Smith" 
End Code

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

Sin embargo, no se 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 se ajuste a varias líneas como el código anterior, deberá usar el operador de concatenación (&), que verá más adelante en este artículo.

Comentarios de código

Los comentarios le permiten dejar notas para usted o para otros. Los comentarios de sintaxis de Razor tienen como 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 la sintaxis de Razor o el carácter de comentario habitual de Visual Basic, que es una comilla simple (') prefijada 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 asignar un nombre a las variables cualquier cosa, pero el nombre debe comenzar con un carácter alfabético y no puede contener espacios en blanco ni caracteres reservados. En Visual Basic, como ha visto anteriormente, no importa el caso de las letras de un nombre de variable.

Variables y tipos de datos

Una variable puede tener un tipo de datos específico, que indica qué tipo de datos se almacena en la variable. Puede tener variables de cadena que almacenen valores de cadena (como "Hola mundo"), variables enteras que almacenen valores enteros (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 es necesario especificar un tipo para una variable. En la mayoría de los casos, ASP.NET pueden averiguar el tipo en función de cómo se usan los datos de la variable. (En ocasiones, debes especificar un tipo; verás ejemplos en los que esto es cierto).

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 As de y, a continuación, el nombre de 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

En el ejemplo siguiente se muestran algunas expresiones insertadas que usan las variables de 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 prueba de tipos de datos

Aunque ASP.NET normalmente pueden determinar automáticamente un tipo de datos, a veces no puede hacerlo. Por lo tanto, es posible que tenga que ayudar a ASP.NET realizando una conversión explícita. Incluso si no tienes que convertir tipos, a veces resulta útil comprobar qué tipo de datos podrías estar manejando.

El caso más común es que tiene que convertir una cadena a otro tipo, como un entero o una fecha. En el ejemplo siguiente se 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, la entrada del usuario se recibe como cadenas. Incluso si ha pedido al usuario que escriba un número e incluso si ha escrito un dígito, cuando se envía la entrada del usuario y lo lee en el 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 la aritmética en los valores sin convertirlos, se produce el siguiente error, ya que ASP.NET no puede agregar dos cadenas:

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

Para convertir los valores en enteros, llame al método AsInt. Si la conversión se realiza correctamente, puede agregar los números.

En la tabla siguiente se enumeran algunos métodos comunes de conversión y prueba para variables.

Método

Descripción

Ejemplo


AsInt(), IsInt()

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

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

AsBool(), IsBool()

Convierte una cadena como "true" o "false" en un 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 punto 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 de punto flotante).

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

AsDateTime(), IsDateTime()

Convierte una cadena que representa un valor de fecha y hora en el 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 ASP.NET qué tipo de comando realizar en una expresión. Visual Basic admite muchos operadores, pero solo necesita reconocer algunos para empezar a desarrollar ASP.NET páginas web. En la tabla siguiente se resumen 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. En función del contexto, asigna el valor en el lado derecho de una instrucción al objeto del lado izquierdo o comprueba si los valores son iguales.

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 que y mayor o igual que.

If 2 < 3 Then
    ' Do something.
End If

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

&

Concatenación, que se usa para combinar cadenas.

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

+= -=

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

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

.

Punto. Se usa 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 a 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

Operadores lógicos Y y O, que se usan para enlazar condiciones.

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 acceso de archivos y carpetas en código

A menudo trabajarás con rutas de acceso de archivos y carpetas en tu código. Este es un ejemplo de estructura de carpetas físicas para un sitio web tal como 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 virtual es una forma abreviada de representar rutas en el código sin tener que especificar la ruta 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 de carpeta virtual siempre usan barras diagonales). La ruta de acceso virtual de una carpeta no tiene que 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 de acceso física exacta).

Cuando se trabaja con archivos y carpetas en el código, a veces es necesario hacer referencia a la ruta de acceso física y, a veces, una ruta de acceso virtual, en función de los objetos con los que se trabaja. ASP.NET proporciona estas herramientas para trabajar con rutas de acceso de archivos y carpetas en código: el método Server.MapPath, el operador ~ y el método Href.

Conversión de rutas de acceso virtuales a físicas: el método Server.MapPath

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

Normalmente no conoce la ruta de acceso física absoluta de su sitio en el servidor de un sitio de hospedaje, por lo que este método puede convertir la ruta de acceso que conoce ( la ruta de acceso virtual) a la ruta de acceso correspondiente en el servidor automáticamente. Se pasa la ruta de acceso virtual de un archivo o carpeta al método, y este 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 mediante 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 en caso de que alguna vez mueva su sitio web a una ubicación diferente. Estos son algunos ejemplos:

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

Si el sitio web es http://myserver/myapp, este es el modo en que ASP.NET tratará estas rutas de acceso cuando se ejecute la página:

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

(En realidad no verá estas rutas de acceso como los valores de la variable, pero ASP.NET tratará las rutas de acceso como si fuera lo que eran).

Puede usar el ~ operador en el código de servidor (como se indicó anteriormente) y en el marcado, de la siguiente manera:

<!-- 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 a la ruta de acceso adecuada.

Lógica condicional y bucles

ASP.NET código de servidor permite realizar tareas basadas en condiciones y escribir código que repite instrucciones un número específico de veces, código que ejecuta un bucle).

Condiciones de prueba

Para probar una condición sencilla, use la If...Then instrucción, que devuelve True o False según la prueba que especifique.

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

La If palabra clave inicia un bloque. La prueba real (condición) sigue la If palabra clave y devuelve true o false. La If instrucción termina con Then. Las instrucciones que se ejecutarán si la prueba es true se incluyen entre If y End If. Una If instrucción puede incluir un Else bloque que especifica instrucciones que se van a ejecutar si la condición es false:

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

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

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

Puede agregar varias condiciones mediante uno o varios ElseIf bloques:

@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 If bloque no es true, se comprueba la ElseIf condición. Si se cumple esa condición, se ejecutan las instrucciones del ElseIf bloque . Si no se cumple ninguna de las condiciones, se ejecutan las instrucciones del Else bloque . Puede agregar cualquier número de ElseIf bloques y, a continuación, cerrar con un Else bloque como condición "todo lo demás".

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

@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 que se va a probar está entre paréntesis (en el ejemplo, la variable de día de la semana). Cada prueba individual usa una Case instrucción que enumera un valor. Si el valor de una Case instrucción coincide con el valor de prueba, se ejecuta el código de ese Case bloque.

Resultado de los dos últimos bloques condicionales mostrados en un explorador:

Razor-Img10

Código de bucle

A menudo, debe ejecutar las mismas instrucciones repetidamente. Para ello, se repite 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 desea repetir el bucle, puede usar un For bucle. 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 For palabra clave , seguido de tres elementos:

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

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

Razor-Img11

Si está trabajando con una colección o matriz, a menudo usa un For Each bucle. Una colección es un grupo de objetos similares y el For Each bucle le permite realizar una tarea en cada elemento de la colección. Este tipo de bucle es conveniente para las colecciones, ya que, a diferencia de un For bucle, no es necesario incrementar el contador ni establecer un límite. En su lugar, el código del bucle For Each simplemente avanza a través de la colección hasta que ésta se completa.

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

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

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

Razor-Img12

Para crear un bucle más general de propósito, use la Do While instrucción:

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

Este bucle comienza con la Do While palabra clave , seguida de una condición, seguida del bloque que se va a repetir. Los bucles suelen incrementar o disminuir una variable u 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, se utiliza el operador de decremento -=.)

Objetos y colecciones

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

Objetos de página

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

@Code
    Dim path = Request.FilePath
End Code

Puede usar las propiedades del Page objeto para obtener una gran cantidad de información, como:

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

  • Response. Se trata de una colecció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 de una base de Customer datos. ASP.NET contiene muchas colecciones integradas, como la Request.Files colección .

A menudo, usted trabajará con datos en colecciones. Dos tipos de colección comunes son el array y el diccionario. Una matriz es útil cuando desea almacenar una colección de elementos similares, pero no desea crear una variable independiente 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, Integero DateTime. Para indicar que la variable puede contener una matriz, agregue paréntesis al nombre de la variable en la declaración (como Dim myVar() As String). Puede acceder a los elementos de una matriz mediante su posición (índice) o mediante la For Each instrucción . Los índices de matriz se basan en cero, es decir, el primer elemento está en la posición 0, el segundo elemento está en la posición 1, etc.

@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 Length propiedad . Para obtener la posición de un elemento específico en la matriz (es decir, para buscar en la matriz), use el Array.IndexOf método . También puede hacer cosas como invertir el contenido de una matriz (el Array.Reverse método) o ordenar el contenido (el Array.Sort método).

Salida del código de matriz de cadenas que se muestra en un explorador:

Razor-Img13

Un diccionario es una colección de pares clave-valor, donde se 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 New palabra clave para indicar que va a crear un nuevo Dictionary objeto. Puede asignar un diccionario a una variable mediante la Dim palabra clave . Los tipos de datos de los elementos del diccionario se indican mediante paréntesis ( ( ) ). Al final de la declaración, debe agregar otro par de paréntesis, ya que en realidad es un método que crea un nuevo diccionario.

Para agregar elementos al diccionario, puede llamar al Add método de la variable dictionary (myScores en este caso) y, a continuación, especificar una clave y un valor. Como alternativa, puede usar paréntesis para indicar la clave y realizar una asignación sencilla, como en el ejemplo siguiente:

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

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

@myScores("test4")

Llamar a métodos con parámetros

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

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

Este método devuelve la ruta de acceso física en el servidor que corresponde a una ruta de acceso virtual especificada. Los tres parámetros del método son virtualPath, baseVirtualDiry allowCrossAppMapping. (Observe que, en la declaración, los parámetros se enumeran con los tipos de datos de los datos que aceptarán). Al llamar a este método, debe proporcionar valores para los tres parámetros.

Al usar Visual Basic con la sintaxis de Razor, tiene dos opciones para pasar parámetros a un método: parámetros posicionales o parámetros con nombre. Para llamar a un método mediante parámetros posicionales, se pasan los parámetros en un orden estricto especificado en la declaración de método. (Normalmente, conocería este orden leyendo la documentación del método). Debe seguir el orden y no se 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 tiene un valor.

En el ejemplo siguiente se supone que tiene una carpeta denominada scripts en el sitio web. El código llama al Request.MapPath método y pasa valores para los tres parámetros en el orden correcto. A continuación, muestra la ruta de acceso mapeada 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 el código más limpio y legible mediante parámetros con nombre. Para llamar a un método mediante parámetros con nombre, especifique el nombre del parámetro seguido de := y proporcione el valor. Una ventaja de los parámetros con nombre es que puede agregarlos en cualquier orden que desee. (Una desventaja es que la llamada al método no es tan concisa).

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, devolverá el mismo valor.

Manejo de errores

instrucciones Try-Catch

A menudo, tendrá declaraciones en su código que podrían fallar por motivos fuera de su control. Por ejemplo:

  • Si el código intenta abrir, crear, leer o escribir un archivo, puede producirse todo tipo de errores. Es posible que el archivo que desee no exista, podría estar bloqueado, es posible que el código no tenga permisos, etc.
  • Del mismo modo, si el código intenta actualizar los registros de una base de datos, puede haber problemas de permisos, es posible que se quite la conexión a la base de datos, los datos que se guardarán podrían no ser válidos, etc.

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

Razor-Img14

En situaciones en las que el código podría encontrar excepciones y para evitar mensajes de error de este tipo, puede usar instrucciones Try/Catch . En la Try instrucción, ejecutas el código que estás comprobando. En una o varias Catch instrucciones, puede buscar errores específicos (tipos específicos de excepciones) que podrían haberse producido. Puede incluir tantas Catch sentencias como necesite para buscar errores que prevé.

Nota:

Se recomienda evitar el uso del método Response.Redirect en declaraciones Try/Catch, ya que puede provocar una excepción en tu 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. En el ejemplo se usa deliberadamente un nombre de archivo incorrecto para que cause una excepción. El código incluye Catch instrucciones para dos posibles excepciones: FileNotFoundException, que se produce si el nombre de archivo es incorrecto y DirectoryNotFoundException, que ocurre si ASP.NET ni siquiera puede encontrar la carpeta. (Puede descomentar una línea en el ejemplo para ver cómo se ejecuta cuando todo funciona correctamente).

Si el código no controló la excepción, verá una página de error como la captura de pantalla anterior. Sin embargo, la Try/Catch sección ayuda a evitar que el usuario vea estos tipos 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