Archivo por meses: enero 2021

Acceder a la página maestra (Master page) desde una página en ASP.NET para .NET Framework (con C# y VB)

Pues eso… el otro día estaba escribiendo código para un nuevo sitio web de un colega (ConservasYoga.com.es) y me decidí a hacerlo en C# , por aquello de que creía que ya no existen plantillas (o eso creo ) en Visual Studio 2019 para ASP.NET con Visual Basic, pero sí existen, de las que no existen es para usar ASP.NET Core.

La cuestión es que quería acceder a ciertas propiedades (y/o métodos) de la master page y lo hice (o lo intenté) tal como lo hago con Visual Basic, es decir, usando Master.Propiedad, pero nada… daba error… después de muchas pruebas lo conseguí… algo rebuscado, pero… probando, probando… lo pude encontrar, y es que en C# para acceder a las cosas definidas en una página maestra hay que usar el nombre de la página maestra (en minúsculas) seguida de un guón bajo y la palabra master (también en minúsculas), es decir, si la página maestra se llama Site.master para acceder al código desde C# hay que usarlo de esta forma: site_master.

Un ejemplo de sitio usando Master Page en VB y C#

Para este ejemplo he optado por seleccionar un sitio en blanco: ASP.NET Empty Web Site (ver figura 1), ya que si se elige el tipo ASP.NET Web Forms Site te añade un montón de código y página, etc., que… en los hosting de ASP.NET que hay por esta zona no funcionan… y si intento que sea de ASP.NET Core ya ni te digo, ninguna de las empresas de hosting con las que he probado (Axarnet, IONOS, acens) lo soportan, incluso una de ellas me dijo que como es código abierto por eso no lo soportan… pero sí venden servidores con Linux, WordPress, PHP… que… ¡lo mismo no son de código abierto! 😉

En fin…

Figura 1. Crear un nuevo proyecto de C# (Empty Web Site)

Cuando trabajo con sitios de ASP.NET no me gusta usar el code behind, si no que prefiero que cada página tenga su código, de esa forma no es necesario compilar la aplicación, si no que se usa el código directamente en el sitio hospedado y ya está… el ASP.NET de IIS se encarga de compilar las páginas y el código a usar. Y lo mejor es que si haces cambios, solo tienes que subir la página o el fichero de código modificado y ya está… ¡a compilarlo tocan! pero… ¡que lo compile otro! 😉

En el segundo tipo de proyecto todo lo que añade el Visual Studio usa el code behind, mientras que en el proyecto vacío, cuando añadas una nueva página (maestra o normal) puedes indicar que no se incluya el código de forma separada (que es lo que viene a significar el code behind o separación entre el diseño y el código).

Si elegimos añadir una nueva página con el código incrustado en la propia página tendremos que hacer algo como lo mostrado en la figura 2.

Figura 2. Añadir nueva página con el código separado de la página aspx

En ese caso, se indica también seleccionar una página maestra para esa página aspx.

Y si decidimos que el código esté separado lo haremos como se muestra en la figura 3.

Figura 3. Nueva página con el código en la propia página.

Es decir, quitamos la marca de la casilla Place code in separate file.

Al añadir una página de esa forma tendremos esto en la página:

<% @ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" 
    CodeFile="Prueba.aspx.vb" Inherits="Prueba" %>

Donde CodeFile indica qué página es la que tiene el código y el Inherits es el nombre de la clase.

Si esto lo has hecho por error… puedes arreglarlo.
¿Cómo?
Simplemente quitando todo lo que se indica en CodeFile y en Inherits y poniendo el código aparte, tal como te muestro a continuación:

<% @ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master"  %>

<script runat="server">

</script>

Nota:
Por cierto, esa página la he añadido al proyecto de C#, pero está usando el código de VB, y es porque yo, por error, he seleccionado una página de Visual Basic (tal como ves en la figura 3).
Pero en el código mostrado lo he cambiado a C#.

Decir o aclarar que en un sitio web hecho con ASP.NET para .NET Framework podemos usar tanto código de VB como de C#, aunque no revueltos.

En este sitio que he creado, en el proyecto de C# uso una página con código de VB y otras dos con el código de C#.

En la página maestre he definido una propiedad con el título de la aplicación.
En C# quedaría de esta forma:

<script runat="server">

    public static string AppName { get; set; } = "Web Site Master C#";

</script>

En la de Visual Basic, esa misma propiedad la definimos como te muestro a continuación:

<script runat="server">

    Public Shared Property AppName As String = "Web Site Master VB"

</script>

Como es una propiedad compartida, en C# se utiliza static y en VB se usa Shared.

Y para usarla desde C# lo haríamos de esta forma, por ejemplo para poner el título de la página 2:

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <h2>Prueba2 en C# para <%= masterpage_master.AppName  %> </h2>
</asp:Content>

Como dije al principio, en VB podemos usar Master para acceder al código de la página maestra, en C# no sepuede.
Lo que también se puede en VB es usar la clase de la página maestra, es decir, tal como se hace en C#.
Decirte que esto último hará que en VB no te muestre un warning que sí muestra cuando se accede a la página maestra usando Master (ver la figura 4).

Nota:
No sé porque ahora me muestra ese warning, ya que siempre lo he usado así (con Master.Propiedad) y nunca había salido esa advertencia, pero bueno… si queremos compatibilidad entre los dos lenguajes, podemos hacerlo usando el nombre de la clase.

Figura 4. Desde C# no se puede usar Master si no el nombre de la clase de la página maestra

Resumiendo el acceso a las páginas maestras desde código

Mejor usar el nombre de la clase, tanto en C# (que es la única forma de ahcerlo, al menos que yo sepa) como en VB.

Te iba a comentar que, aparte de lo que ya hemos visto, desde un sitio web de asp.net con .NET Framework se puede usar tanto código de VB y de C# en conjunto, solo hay que poner dicho código en carpetas diferentes e indicarlo en el fichero Web.Config.

Esto ya lo expliqué cuando salió ASP.NET 2.0 y por tanto las páginas maestras.
Este es el enlace en elguille.info: Usar clases de VB y C# en una misma aplicación Web.

Pero te lo resumo brevemente.

Usar código de VB y C# en un mismo sitio de ASP.NET Framework

Crea la carpeta de código App_Code, decide qué lenguaje será el que use las clases puestas en esa carpeta (normalmente el lenguaje con el que has creado el proyecto), crea una nueva carpeta (dentro de App_Code) para poner las clases del otro lenguaje.

Por ejemplo, si queremos que en la carpeta App_Code estén las clases de VB y en la carpeta c-sharp (App_Code\c-sharp), pondremos esto en el fichero web.config:

<compilation debug="true" strict="true" explicit="true" targetFramework="4.7">
    <codeSubDirectories>
        <add directoryName="c-sharp" />
    </codeSubDirectories>

d </compilation>

Este código estará dentro de la rama: <configuration><system.web>.

Para acceder a las clases o el código se hace de la forma habitual, en este ejemplo, he definido una propiedad estática/compartida para que se pueda acceder desde el código ASP.

Hay que tener en cuenta que C# distingue entre mayúsculas y minúculas, mientras que a VB le da igual como la escribamos.

<p>Usando el código definido en la carpeta <b>App_Code</b></p>
<p>Acceso al código de C# (class1.Nombre):  <% = Class1.Nombre  %> </p>
<p>Acceso al código de VB (class2.Nombre): <% = Class2.Nombre %> </p>
<p>En C# hay que usar correctamente el nombre: Class1 y Class2 (no class1/class2 como en VB).</p>

Y esto es todo… este es el código en GitHub por si le quieres echar un vistazo.

 

 

Cambios en el código de C# para que compile con C# 5.0

Al limpiar el proyecto de los «packages» que añade el Visual Studio, empiezan los errores, uno de ellos es que C# 5.0 no permite asignar valores a las auto-propiedades, por tanto, el código mostrado antes hay que sustituirlo por este otro:

El de la clase Class1.cs: (tanto en el proyecto de VB como en el de C#)

public static string Nombre 
{ 
    get { return "¡Hola Mundo de C#!"; }
} 

El de la página maestra:

<script runat="server">

    public static string AppName 
    { 
        get {return "Web Site Master C#"; } 
    }

</script>

El código de VB no hay que modificarlo, se ve que el compilador usado reconoce la autodefinición de propiedades con asignación de valores.

En el código de GuitHub ya está rectificado.

Nos vemos.
Guillermo

Cómo enviar cambios de línea usando mailto (html/script)

Pues eso… llevo unos días creando un nuevo sitio usando ASP.NET (con C#) para un colega al que le ayudo a vender sus productos por internet (Conservas Yoga) y probando el envío de emails desde el sitio usando una cuenta de gmail, me ha estado dando problemas y al final no he conseguido que funcione, no creo que sea por los permisos de gmail, ya que en la aplicación de gsNotasNET.Android me ha estado funcionando bien (o en su día en foros.elguille.info, pero en este nuevo sitio no había forma… así que… he hecho lo que suelo hacer cuando las cosas no funcionan: ¡cortar por lo sano y usar lo que siempre funciona!

Y lo que siempre funciona es usar mailto para enviar mensajes.

¿Cómo indicar el asunto al usar mailto?

Una de las cosas que siempre he usado es indicar el asunto cuando se pulse en el enlace de mailto (ahora te muestro el código), en ese caso, lo que hay que hacer es indicar un parámetro con la palabra clave subject el signo igual e indicar el texto del asunto.

Según desde que navegador se use habrá que indicar de forma distinta los espacios en el asunto, normalmente la forma más segura de hacerlo (válido para todos los navegadores, más viejos o más recientes) es usar %20 (equivalente en valor hexadecimal a un espacio).

Pero como te digo puedes usarlo con espacios y casi siempre funciona.

El código para enviar un email a la cuenta tuemail2021@gmail.com con el asunto «Comentario desde el guille mola» sería el siguiente:

Pulsa en este enlace para enviar un mensaje con el asunto: Comentario desde el guille mola.

El código de esa línea sería el siguiente:

<p>Pulsa en este enlace para enviar un mensaje con el asunto: 
    <a href="mailto:tuemail2021@gmail.com?Subject=Comentario desde el guille mola">
        Comentario desde el guille mola</a>.</p>

Si quisieras asegurarte de que no dará problemas, puedes cambiar los espacios por %20, pero creo que así debería funcionar (si no pruebas y te da error o algún mensaje fuera de lo común, por favor lo comentas en la sección de comentarios de este post, gracias).

Y ahora vamos a la parte principal de este artículo… Sí, podría haber empezado por aquí, pero… antes había que sentar los precedentes 😉

¿Cómo indicar el cuerpo del mensaje usando mailto?

Esto ya lo había hecho yo antes, pero el otro día necesitaba añadir cambios de líneas al texto del cuerpo del mensaje y no daba con la forma de hacerlo… menos mal que en internet siempre hay alguien que te lo explica 😉

En mi caso fue en este sitio: HTML mailto link.

Y el truco para añadir cambios de línea es (ahora parece tan obvio) usar los códigos de cambio de línea (LF o Line Feed) y retorno de carro (CR o Carriage Return) cuyos valores en decimal son: LF = 10, CR = 13, que en hexadecimal son: x0A y x0D, por tanto añadiendo esos valores en cada cambio de línea (normalmente se hace al revés, primero el CR y después el LF, pero creo que dará lo mismo).

Así que… si queremos usar el asunto del ejemplo anterior y queremos poner el siguiente mensaje (el body del email):

Hola Guille, perdón Tu Email 2021,

Este mensaje es una prueba desde post del blog.

¡Hasta la próxima!
<Indica tu nombre>

El enlace sería este: Enviar un mensaje con el texto arriba indicado.

El código quedaría de la siguiente forma:

<p>El enlace sería este: <strong>
    <a href="mailto:tuemail2021@gmail.com?Subject=Comentario desde el guille mola
        &Body=Hola Guille, perdón Tu Email 2021,%0D%0A%0D%0AEste mensaje es una prueba desde post del blog.%0D%0A%0D%0A¡Hasta la próxima!%0D%0A---Indica tu nombre---
        Enviar un mensaje con el texto arriba indicado</a></strong>.</p>

Nota:
Hay que tener cuidado con los editores de sitios WEB, como este de WordPress, ya que para indicar el asunto se hace con ? (?Subject=) después del nombre de la cuenta de correo (el ? es porque es el primer parámetro) y el cuerpo se usa con &Body=, es decir, cada parámetro o argumento que no sea el primero debe indicarse con el signo & (ampersand). Y los editores de código HTML lo sulen cambaiar pro &amp; (de ampersand).
Así que… si al pulsar en el enlace anterior no funciona, es que el editor de WordPress lo ha modificado… pero creo que aún así, seguirá funcionando.

Es decir, para usar el asunto se indica co ?Subject= y para indicar el cuerpo o texto del mensaje se hace con &Body=.

Si inviertes el orden, primero indicas el Body y después el Subject, la cosa quedaría así:
?Body=Cuerpo del mensaje%0D%0ACon cambio de línea.&Subject=Asunto del mensaje.

Si pulsas en este enlace, el orden está invertido (tal como muestro arriba).

Y ya solo nos queda repasar lo comentado:

Recordando que en Subject y Body dan igual las mayúsculas o minúsculas.

  1. Para indicar el asunto se usa Subject (o subject)
  2. Para indicar el cuerpo (o texto) del mensaje se usa Body (o body)
  3. Para indicar espacios tanto en el asunto como en el texto del mensaje puedes usar %20
  4. Para indicar cambios de líneas (normalmente en el cuerpo del mensaje) usa: %0D%0A

Y esto es todo… espero que te sea de utilidad… y si no te sirve, al menos a mí me servirá algún día (ya que seguro que me olvidaré de este truco si pasa un tiempo sin usarlo).

Nos vemos.
Guillermo