Apuntes de .Net (ASPX, C#)

Conceptos Generales

Intellisense:PopUp que aparece cuando se está codificando

Se puede indicar que las páginas se optimicen para un navegador en partícular

Console.Writeline("Mensaje a consola");

Console.ReadKey();Para que espere una tecla

while (!Console.Readline().toUpper().equals("FIN")){}

System.Threading.ThRead.Sleep(1000):Pausa de 1 segundo

const int p = 12; //Definicio de constante

public class - Se ve de todos lados

internal class (default) - Se ve dentro de la misma unidad de compilación

    
                Los accesos a sus métodos y variables son los mismos que la pública
                pero en la misma unidad de compilación
            

Los métodos tienen 5 modificadores: public, private, protected, internal y protected internal

Métodos y variables públicas se pueden ver de todos lados si la clase es pública

Métodos y variables privados solo son vistos desde la misma clase

Métodos protected solo son vistos de la misma clase y sub clase

Métodos y variables internal solo son vistos por las clases de la misma unidad

Protected Internal combinan el acceso de ambos

Si no se especifica, por default métodos y variables son privados

Se sugiere métodos públicos y variables privadas. Que las variables se manipules con setters y getters

Edit - Refactor - Encapsulate Field (CTRL-R CTRL-E)

La unidad de compilación es un namespace y se usa Using [namespace];

La unidad de compilación es un archivo de texto con la extensión .cs

Se puede asignar una variables a un namespace using miN=joca;

Lo ideal es una clase por compilation unit

static void Main(string[] args){}

                    namespace joca {
                        namespace p1{
                        }
                        namespace p2{
                        }
                    }
                    namespace joca.p1{
                    }
                    namespace joca.p2{
                    }                    
                

Cadenas

StringBuilder sb=new StringBuilder();sb.Clear()

List<String> ml_repro;ml_repro.count; ml_repro[i];

string.IsNullOrEmpty(miVarString):Regresa verdadero si miVarString es nula o string vacio

Arreglos y Matrices

String[] arr_lineas;

String[] nombres = { "Jose","Daniel","Maira","Daina","Iker","Marina","Juan" };

nombres.Length

List<String> ml_repro;ml_repro.count; ml_repro[i];

Archivos

System.IO;

Encoding.Default

StreamReader sr=new StreamReader("c:\arch.dat");

while((ls_linea = sr.ReadLine()) != null) {}

sr.close(); //Ejecutar al final de la función para evitar el tema de memoria

StreamWriter sw=new StreamWriter("c:\arch_sal.dat",false,Encoding.Default);

sw.Writeline("");sr.Write("");

Path.DirectorySeparatorChar; //Separador de Windows

Path.GetFileName("c://muestra.dat"); //Nombre de un archivo

String[] files = Directory.GetFiles("miPath"); Archivos en un directorio

Programación WEB

Comunicación:

HttpRequest - Cliente hacía Internet y al Web Server

html document Response - Web Server a Internet a cliente

IP Address:Todas las máquinas tiene un identificador único ___.___.___.___ (0 a 255)

Socket:IP + Puerto (default 80)

el WEB Server no guarda la información del cliente

Protocol:Reglas más estandares. HTTP es un protocolo que dice como es la comunicación entre el cliente y el servidor

<INPUT method="POST" type="submit">:

GET:La información se manda como QuerieString, la longitud es restringida

POST:La información se manda en el Message Body. No tiene una longitud restringida

Response Status:1XX - Informationl, 2XX- Success, 3XX - Redirect, 4XX - File not Found, Not Authorized, Not Authenticated 5XX - Server Error

Internet Information Service IIS: Se ejecuta con inetmgr.exe ó Control Panel-Administrative Tools- IIS

Bindings - Configuración

Basic Settings - Ruta de la máquina donde se encuentra el Sitio WEB

HTML, JavaScript

Sitios de consulta:

W3Schools

Versiones de Visual Studio

Apuntes y ejemplos de HTML

<input />type="reset";["submit","radio", "checkbox", "file", "image"]. Cuando es image funciona como un botón. Los "radio" deben tener el mismo "name" para que sean grupos de botones

<label for="chk" >Hola</label> En la propiedad for le indico a que radio o check pertenece

<TEXTAREA /> rows="5" cols="4"

<SELECT > <option value="1" /> size="3" "multiple"-selecciona más de una "checked"

<HR />Parece un salto

ALT-SHIFT:Deja seleccionar varias líneas y escribir lo mismo. Ideal para agregar un querie al código

JavaScript (Invented by Brandom Eich): Lenguaje interpretado que se ejecuta en el browser

<SCRIPT language="javascript" />

for (var i=0;i<20;i++)

document.write("");document.writeln("");

"\"" Escaping comillas dobles

Fechas:dt = new Date();dt.getDate();dt.getDay();dt.getMonth();dt.getFullYear();

Handling Events en JavaScript

Onclick="[return] ValidaDatos()" en un botón con el return sirve para poder validar datos antes de hacer el submit de ese botón

document.forms[0].elements[0].value valor del primer elemento del primero form

document.forms["frm1"].elements["txtclave"].value Elemento cuya propiedad name="txtclave" en el form cuya propiedad Name="frm1"

document.frm1.txtclave.value Mismo caso anterior.

txt.toUpperCase() convertir a mayúsculas

OnChange Capturas y abandonas el INPUT. Cambias el valor en SELECT o la selección en RADIO

OnKeyPress Hasta que capturas el siguiente carácter en un INPUT

OnKeyUp En cuanto capturas un carácter en un INPUT

ind=document.frm1.selOpera.SelectedIndex Índice actual del SELECT

val=document.frm1.selOpera.options[ind].value Valor del índice selecciondado del SELECT

switch(val){ case "1": break; case "2": break;} Estructura Switch

ParseInt(str) convertir a número

document.frm1.miRadio[0].checked Se fija si esta seleccionado la opción cero del type="radio" con el name="miRadio". Propiedad del radio checked="Checked"

onmouseOver="" Pasas el menú por encima

onmpuseOut="" Quitas el menú

document.images[0].src="FocoPrendido.jpg" Asignas la imágen al primer IMG del documento

document.getelementByID("miImg") Obtiene referencia al objeto con ese ID

onclick="Cambia(this)" El parámetro this se refiere al objeto que manda a llamar la función

document.getElementById("miSpan").Style.display="none" Pone invisible el objeto de Id="miSpan", con display="" se regresa

document.getElementById("miSpan").Style.fontWeight="bold" letras BOLD con fontWeight="" se pone normal

debugger; Con esto deja debuguear y en tools-InternetOptions-Advance hay que desmarcar las casillas disable script debugging hay una para IE otra para other

document.getElementById("miSpan").innerHTML="<b>Hola</b>" Pone este código como parte del HTML y lo aplica

document.getElementById("miSpan").innerText="<b>Hola</b>" Pone esto como texto, NO HTML.

Probar las dos instrucciones anteriores con un INPUT que cambie a otro control

onsubmit="return validadatos()" en el FORM para detener el submit del formulario

"return confirm("are you sure?")" La respuesta del confirm es boolean

n1=="" Valida Cadena Vacía

IsNAN(n1) True si no es número, false si es número

n1=="" Valida Cadena Vacía

onLoad="inicia()" en el BODY ejecuta es función al cargar

setTimeOut("CambiaImagen()",1000) Ejecuta está función dentro de un segundo.

Si se manda a llamar dentro de CambiaImagen() se ciclaría cada segundo. Hay que ver si con 0 se apaga

n1.IndexOf("pepe") Regresa el índice donde empieza "pepe", o -1 si no lo encuentra

fh=new Date().toLocaleTimeString() Regresa la fecha en formato local

nw=window.open("miPag.html","win"[, features]) Abre una pestaña, con "win se evita que abra muchas veces"

features menubar=NO, scrollbar=NO, width=400, height=500, location=NO, resizable=Yes

nw.focus() Se le manda el foco a la ventana si está abierta. Hay que ver si la muestra

setTimeOut("nw.close()",5000); Cierra la ventana en 5 segundos

arch.js Archivo con código JavaScript extensión js

<script>src="arch.js"</script> Para incluir el js

ASP Básico

.asp - ASP.DLL (Isapi Application) - ASP engine Regresa HTML al browser

<% %>Porcentage delimiters. Para limitar el código de programación

ASP Objects: Request, Response, Session, Application, Server, ObjectContext, ASPError

appwiz.cpl Ejecuta las windows features. Seleccionar FTP Server, Web Management y World Wide web Services

.asp files: Tienen que tener permisos de FullControl to Everyone

Request.ServerVariables: PATH_TRANSLATED es el Path Físico

<form action="miAsp.asp" method="POST"></form> si el method es igual a GET se usa el QueryString

Request.Form["miCampo"] o Request.QueryString["miCampo"] Depende de POST o GET

Propiedad NAME Para nombrar los controles del formulario. Request.Form["miRadio"] se obtiene el seleccionado

value="<% =miValor %>": Para iniciar los controles en HTML o recuperar sus valores

ASP.NET Introducción (RadioButton, Sender)

Guardar el proyecto:FileSystem - En el disco de la compu. ftp - en una ubicación por ftp y http directo en el site

<asp:[Control] runat="server" /> Controles de servidor

form - action Es mejor no usar esta propiedad

<%@ Page %> aspx directives

Open Web Site Abre directo el sitio del IIS

Set As Start Page Para decirle al VS en cuál página ejecutar

System.Drawing.Color.Green Color Verde

System.Drawing.Color.FromName("red") Le puedo pasar el color con el texto

RadioButton GroupName="mi Grupo" para agruparlos

OnCheckedChanged - Evento del radio botón al cambiar. Necesita AutoPostBack

AutoPostBack Genera en automático el javascript necesario

sender Control que ejecuta el evento

RadioButton rb=(RadioButton)sender; dentro del evento OnCheckedChange por ejemplo

System.Drawin.Color.FromName(rb.text) - De esta forma si la agrego más opciones al RadioButton sabrá que hacer

Calendar, ListBox, EventArgs

EventArgs Cuando el segundo elemento es no es EventArgs es una clase heredada y se deben ver las propiedades que se pueden gestionar

Response.Write("") Escribe la cosas antes del HTML, no es buena prácita usarlo

Calendar - SelectionChanged Aquí se cacha el valor que cambió

Calendar1.SelectedDate.toLongDateString() Obtiene la fecha. Este control no deja cambiar el año

Calendar - DayRender Le puedo decir los días válidos a seleccionar

e.Day.IsWeekend Si es fin de semana

e.Day.IsSelectable=false Indica si se puede seleccionar

e.Cell.ForeColor Le puedo asignar el color

TABLE-Insert Para acomodar los controles, mejor con CSS. Por cierto hay que quitar los estilos que ponga

lst Prefijo para ListBox

ALT-SHIFT-ARROWDOWN Escribir en varias líneas al mismo tiempo

IsPostBack Para saber si es PostBack

form_load Donde se puede cargar el ListBox o inicializar controles

ListItem li=lstMiListBox.SelectedItem; Obtengo el Item seleccionado

li.text="Item 1"; li.Value="1"

li.Selected=false Para que no se quede seleccionado

Listbox.Items.Remove(ListItem) Quitar un elemento de la lista

Listbox.Items.Add(ListItem) Añadir un elemento

Understanding Control Properties and Events

System.Web.UI.HTMLControls con esta clase puedo controlar los objetos de HTML poniendo runat="server". Aunque esto ya es obsoleto

System.Web.UI.WebControl De donde heredan todos los controles de servidor (Control Server)

Label: Con la pripiedad ID se puede controlar con JavaScript

Literal: mode="encode" para que ponga los carácteres especiales de HTML en el texto

Server.HTMLEncode("a<b") Para poner los carácteres especiales desde código de c#

TextBox: textmode="multiline[password,single]" se admiten otros a partir de HTML5. con la propiedad AutoPostBack hace el Refresh al perder el foco

ValidateRequestMode="Disabled" Con esta propiedad no valida si se meten carácteres de HTML el TextBox

Panel: Es un DIV, y pongo sus controles. Tiene la propiedad DefaultButton="IdDel Buton"
El DefaultButton genera un evento en JavaScript para OnKeyPress

Button:
OnClientClick("Return miFuncBool()") - La función se codifica en JavaScript
OnCommand - Pongo mi método C#
CommandEventArgs - e.CommandName - Obtiene lo que tenga la propiedad CommandName
CommandName - Propiedad de botón
Button btn=(Button)SenderPuedo usarlo así para todos los botones en el mismo evento

ImageButton: Es un butón imágen con la propiedad ImageURL

HyperLink: NavigateURL es la propiedad para poner el Link
Se le puede dar text o imageURL. No tiene las propiedades de los botones

LinkButton: Es un link pero tiene las pripirdades y eventos de los button

Image: Sólo pone una imágen

ListControl: Clase de donde vienen los controles de lista
DropDownListBox, ListBox, CheckBoxList, RadioButtonList, BulletedList
Properties: Items, SelectedIndex, SelectedItem, SelectedValue, Text, AutoPostBack
ListItem litem=new ListItem(); litem.text="México"; litem.value="1";litem.selected
lst.Items.Add(litem) lst es la variable donde tomo el control de tipo lista

OnSelectedIndexChanged: SelectedValue

sender is DropDownList Para ver el tipo de objeto que tiene el sender y con eso programar de acuerdo a sus propiedades. Quizás podemos tomar el sender y con su ID igual saber que hacer

ListBox - Rows Para darle más altura al Listbox con esta propiedad

miListBox.GetSelectedIndices() Para ver todos los seleccionados. Esto si está activada la propiedad selectionMode="multiple"

foreach(ListItem li in miCheck.Items){} Con esto veo los seleccionados en un RadioButtonList

RepeatDirection="Horizontal", RepeatColumns="3" Para los checkBoxList y radiobuttonList

RepeatLayout para decirles si los ordeno con un <table> o un <ul>

ASP Page Life Cycle

Browser Manda el URL con una extensión ASPX, HTML

IIS - ASPNET_ISAPI.DLL IIS reconoce la extensión ".aspx" y ejecuta esta DLL

aspnet_wp.exe/w3wp.exe/webdev.webserver.exe La DLL esjecuta el programa de acuerdo al sistema operativo

THREAD Se crea uno por cada request al browser y se elimina al terminar

AppDomain Se crea solo una vez en el prim er request al AppApplication

Página ".aspx" Consta de dos archivos que podemos editar pagina.aspx y pagina.aspx.cs

public partial class _pagina:System.Web.UI.PageEs parcial porque la clase donde se definen los controles del ".aspx" se crea en tiempo de ejecución "RUNTIME"

Page Event and Control Manage its stages

Eventos del .aspx

Las acciones del usuario ocurren en el browser, los eventos en el servidor

web.config-compilation-debug="true" Genera un error en el .aspx y dale refresh por ejempolo poniendo <% dsfsfdsfdsf %> luego CTRL-F5. Aparece una liga "show complete compilation", ahí se puede ver el programa creado

Secuencia de eventos del ".aspx":

1.-Initialization

2.-LoadViewState: Se cachan valores de post y propiedades de controles

3.-LoadPostBackData

4.-*Load

5.-RaiseBackEvent

6.-SaveViewState

7.-Render

1. Page Class Object is Created

2. Se ejecutan los contructores de página pero no se pueden modificar

3. Page_Init: Se agrega copiando Page_Load. Se puede programar pero no se debe utilizar para iniciar controles

4. Se inicializan los valores y propiedades de los controles cuando es Posted con lo que trae en ViewState

5. Page_Load: Aquí si inicializar controles y puede sobrescribir los valores del paso 4, por eso validar con IsPostBack las inicializaciones

6. Se ejecutan los eventos de los controles

7. Se guardan las propiedades en ViewState

8. Page_PreRender: Se ejecuta después de los eventos de controles. Es el último evento de la página

9. Page y controles son enviados al browser

Hidden ViewState: Guarda de forma encriptada las propiedades y valores de los controles. Si apago la propiedad viewstate=false, no se guardan los valores de ese control para el posteo y se inicia con los valores de inicio del control, como una cadena vacía en un input de tipo text. Quizás ea bueno apagarlo si no vale la pena cargar los valores de posteo como cuando tomos los valores que tenga la BD

Override:Con esto me aparecen los eventos que les antepongo el prefijo Page, como Page_Load

Directiva AutoEventWireup="true" Si lo pongo en false no se ejecutan los eventos que empiezan con Page

Evento OnLoad:Si le hago override y quito el base.OnLoad(e), no se ejecuta lo de Page_Load

Using Custom Classes

App_Code:Aquí pongo mis clases. Si son en distintos lenguajes se debe separar en diferentes carpetas dentro de App_Code y en web.config - compilation incluir los directorios

<codeSubDirectories>

<add directoryName="VB"/>

<add directoryName="CS"/>

<add directoryName="OtroMas"/>

</codeSubDirectories>

CodeBehind: Cuando creo el aspx, puedo indicarle que sin el codefile aparte para que no pida el CodeBehind y tendría que programar el C# al principio. En <script runat="server">[código C#]</script>

CSS-Themes

InLine Style:En el mismo TAG

Internal StyleSheet:En el Head de la página

External StyleSheet:Con archivo CSS

Tag1, Tag2 {}Aplica a ambos

Tag1 Tag2 {}Tag2 dentro de Tag1

Tag1.ClassNameTag con esa clase

#Id:Tag con ese ID

<link href="MiHojaDeEstilo.css" rel="StyleSheet">en el mismo TAG

App_Themes:Se agrega en los ASP Folder y dentro puedes agregar los Theme.Dentro de cada Theme puedes agregar un SKIN o un archivo CSS

Skin:No tiene Intelligense, lo mejor es copiar uno

Skin sobrescribe al CSS

SkinId:Con esta propiedad ligo un Skin en partícular y un control

EnableTheming="false":No toma el theme solo el styleSheet si tiene

web.config - System.Web <pages theme="miTema">:Tema que aplica a todo el sitio

Si en lugar de StyleSheetTheme - Para que las propiedades locales sobrescriban los SKIN

También se pueden utilizar como directivas de la página

Page_PreInit:Page.Theme="miTema"

Response.Redirect(Request.RawUrl):Request a la misma página para cambiar el tema que se guarda en una variable de sesión

CssClass:Existe para todos los controles

Redirecting Options

Hyperlink:Solo cambia de página. El URL del browser cambia a la página destino . PostBack y PreviousPage son nulos

Response.Redirect:Cambia de página y se puede armar el queryString que ya hace el encode, hay que hacer el decode del lado del destino. El URL del browser cambia a la página destino

Server.Transfer:Se puede utilizar Context para mandar parámtros. Si tiene PreviosPage PostBack, El BROWSER mantiene la URL de la página origen, por lo que un REFRESH puede causar resultados extraños. Se puede accesar a los valores por Context, Request.Form["miCampo"] o por propiedades públicas definidas en la clase de la página origen.

CrossPage PostBack:Lo mismo que Server.Transfer pero sin el Context

PreviousPage:Instancia de la clase de la página origen. En la página destino se puede indicar en una directriz el tipo de objeto de lo contrario se tiene que hacer CAST. <%@ PreviousPageType VirtualPath="~/apuntes-dotnet/classes-and-css-themes.aspx" %>

PreviosPage.IsCrossPageBack:Para poderla distinguir del tranfer. Quizás también usa Context el CrossPage con algún evento antes de salir de la página

Context.Items["txtPrueba"] = txtPrueba;Puede llevar cualquier objeto

((TextBox)PreviousPage.FindControl("txtPrueba")).Text:Usando findcontrol para accesar a la página origen

public TextBox mTxtPrueba{get{return txtPrueba;}}Para exponer un objeto

Creating and Using MasterPages

Title - MasterPageFileAñadiendo estas dos propiedades en la directiva PAGE y eliminando todo el código HTML del form se asigna de forma manual a la master

<asp:ContentPlaceHolder ID="CPH1" runat="server">On Building</asp:ContentPlaceHolder>:Puedo añadir los que necesite en la Master

<asp:Content ContentPlaceHolderID="CPH1" runat="server"></asp:Content>Esto sustituye a cualquier contenido que pueda tener el PlaceHolder en la MasterPage

Master:Instancia del MasterPage

Master.FindControl("lblTexto"):Para acceder a un control del MasterPage. También se puede exponiendo una propiedad en el MasterPage pública.Se debe hacer el casting.

<%@ MasterType VirtualPath="~/apuntes-dotnet/Site1.Master" %>:Si se usan propiedades para acceder a los controles de la Master, con este directiva ya no se tiene que hacer el Casting

Page.ResolveUrl("~/mipage.aspx"):mipage.aspx

Page.ResolveClientUrl("~/mipage.aspx"):../mipage.aspx

runat="server":Con esto se resuelven las URL, por eso en el PlaceHolder del HEAD no es necesario resolverlas para los StyleSheet

PlaceHolder del HEAD:Se deben programar aquí los JavaScript y colocar StyleSheet

Page_LoadComplete:Este evento se debe utilizar en el form, porque el Load de la master sobrescribe el Form

MiControl.ClientID (ID) - MiControl.UniqueID (NAME):Con estas propiedades podemos en el JavaScript poner el control que se refiere y no nos preocupamos del ClientIdMode="[static, AutoId, Inherit, Predectible]"

User Controls

Add-NewItem-Web Forms User Control:Se arrastra al formulario

<%@ Register Src="~/apuntes-dotnet/Login.ascx" TagPrefix="uc1" TagName="Login" %>Se incluye la directiva

public String bkColor { get; set; } con esto le añado una propiedad que se define en el ASPX

En los eventos del UserControl puedo programar la funcionalidad y ejecutar eventos si quiero que esa funcionalidad se programe en el master Page

OnOnFirmado="IniciaSesion"Le mando a llamar a mi evento public event EventHandler OnFirmado;

OnFirmado(this, EventArgs.Empty);Ejecuto desde el UC mi evento sin argumentos

public event FirmadoHandler OnFirmado; Declaro un delegate con arguementos

public delegate void FirmadoHandler(object sender, FirmadoArgs e);Delegate con argumentos

public class FirmadoArgs : EventArgs Clase de tipo EventArgs para los arguementos

FirmadoArgs fArgs=new FirmadoArgs(){UsuName=txtUsu.text; UsuPWD=txtPWD.text

OnFirmado(this, fArgs);Ejecuto el evento cargando los argumentos

Using Validation Controls

Las validaciones se manejan en JavaScript mientras no se diga lo contrario

BaseValidator:Clase padre de las clases validadoras. Las validaciones ocurren del lado del cliente, así que no hay submit

<@ Page UnobstrusiveValidationMode="None"

RequiredFieldValidator:Se requiere su captura

ValidationSummary:Saca todo los errores de acuerdo a la propiedad ErrorMessage

ErrorMessage:Error a desplegar "capture el correo"

Text:Mensaje a desplegar en ver del error "Requerido"

ControlToValidate:Control sobre el cual aplica la validación

InitValue:Valor que no es válido, en un dropdown quizás para hacer select

ShowSummary="false" ShowMessageBox="true" Se mandan con alert los mensajes en el summary

DisplayMode="List" Forma de desplegar los mensajes en el summary

CompareValidator:Compara el valor de dos campos

ControlToValidate Se especifica el valor del primero control "txtPWD"

ControlToCompare Se especifica el valor del segundo control "txtPWDRepite"

Display="Dynamic" con esta pripiedad el mensaje no ocupa espacio cuando tienes más de una validación

Type Tipo de datos que se debe comparar

Operator Mayor que, menor que

SetFocusOnError="true" Le manda el foco al control a validar

tooltip Mensaje cuando estoy arriba del control

Operator="DataTypeCheck" Type="String" Para validar el tipo de dato

ValueToCompare="10" Validar contra un valor en vez de un campo

CompareValidator1.ValueToCompare = DateTime.Now.ToShortDateString(); Para darle la fecha de inicio como comparación

<globalization culture="hi-IN"></globalization> Para que en base a esto compare la fecha

RangeValidator MinimumValue="15" MaximumValue="50"

RegularExpressionValidator ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Para un correo

Expresiones regulares: regex tutorial en google

\w Cualquier palabra

+ Uno o más

() Otro componente

[] Alguna de esas [-+.'] Uno o más guiones, un punto o un apóstrofe

* 0 o más veces

{x} x veces

\s Espacio

? Cero o una

[0-9]{3} Cualquier número entre 0 y 9, 3 veces

CustomValidator:Para capturar su propia función de validación

OnServerValidate="CustomValidator2_ServerValidate":Función en C#

ClientValidationFunction="valSexo":Función en JavaScript

Ambas reciben src y args:src-se refiere al control de validación. args-args.Value (es el valor) args.IsValid (Se debe poner true si está bien o false si está mal, es el valor de retorno)

Internet Options-Security-Local Intranet allow - disabled opciones de Scripting para quitar JavaScript

Page.IsValid:Verdadero si todas las validaciones del cliente están ok. si se indica aplica a los del grupo

if (!Page.IsValid) return;:No evitas el submit pero aquí ves que todo sea válido, tanto validaciones de cliente como de servidor

CausesValidation="false"en un botón tipo cancel, si no quiero que ese valide

ValidationGroup="miGrupo"Validaciones que aplican a un grupo de controles

Page.Validate();Para que se pinten las validaciones de inicio cuando no es PostBack. Se le puede indicar el grupo

Page.GetValidators("grupo") o PageValidators:Colección de los validadores

Variables estáticas, Sessione, cookies, HttpContext

static:Se ven desde cualquier browser y usuario siempre. Si esta declarada como privada en el form, solo lo ven las páginas de ese form.

Viewstate["miDato"]: es "==null" si no trae nada y se guarda escriptado en el viewState Como que funciona en el segundo submit porque en el primero se guarda, solo funciona en el submit

[Serializable]Se debe etiquetar la clase de esta forma si queremos mandar objetos en el ViewState

EnabledViewState="false":Para que no se use. Puede aplicar a nivel directiva en toda la página o nivel control

ViewStatedMode="disabled":Siempre que EnabledViewStated este activado este puede utilizarse

HiddenField:Con un JavaScript en OnClientClick puedo pasar los valores al hidden

Server.UrlEncode(" a<b<canvas></canvas>>"), Server.HtmlEncode(""), HttpUtility.HtmlEndoce("") o <%: para mandar los encode

HttpContext.CurrentAcceso al Context desde la clase. Los valores se mandan con Server.Transfer("")

Context.Items.Keys.OfType<String>()Colección de llaves del Context, poder leer todos los string

HttpCookie c = new HttpCookie("AP001");Crea la cookie

Set Cookie: Color=Red; expires=1-2-2022;path=/Demo;domain=microsoft.com;secure=false

Si secure es true busca que sea https de lo contrario el server no la regresa

persistent cookie: Se guarda en un archivo, por lo cual son accesados desde diferente las diferentes instancias de un browser

non persistent cookie: Se guarda en la memoría del IE. Se mantienen diferentes en cada Browser

c.Values["usuClave"] = txtUsu.Text;Para mandarle una subllave

c.Value="20"Valor a la cookie

c.Expires = DateTime.MaxValue;Para que sea persisnt

Response.Cookies.Add(c);Siempre que quiero actualizar la cookie se debe sobrescribir

Response.Cookies["AP001"].Expires = DateTime.Now.AddDays(-1);Destruir la cookie o

c.Expires=DateTime.Today.AddDays(-1); y la sobrescribo

HttpCookie c = Request.Cookies["AP001"];Recuperar el valor de la cookie

Response.Cookies:Colección de las cookies

Request.Path:/apuntes-de-dotnet.aspx

Request.ApplicationPath:/

c.Path=Request.ApplicationPath;

foreach(String ck in Request.Cookies) sValor[i]=ck.Value;Leer las cookies

Lo bueno de las cookies es que puedo guardar los valores para después a diferencia de las variables de sesión

300 cookies por browser, 4KB por cookie, 20 cookie por server o domain CookieDictionary para no limitarse y usar subkey

foreach(String sk in c.Values) lsValor=c.Values[sk]; Leer valores de las subkeys

HttpApplicationState:Application["cuenta"]=null - Es como una variable estática

Se comparte entre diferentes browser, es mejor utilizar la variabloe estática

Resumen

LocationSecuredState Shared Across PagesAcross Clientes
Static ServerYesYesYes
Application ServerYesYesYes
ViewState ClientYes (encrypted)No No
HiddenField ClientNo No No
QueryString ClientNo Two PagesNo
Context ServerYesNo (Request Only)No
Cookies ClientNo YesNo
Session ServerYesYesNo

Archivo Web.Config

Puede estar en todas las carpetas del sitio WEB. Los archivos en los subdirectorios sobrescriben a los anteriores

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config: Aquí se encuentre el archivo padre del web.config (padre sitios WEB) y machine.config (padre Server)

System.Configuration.ConfigurationManager.AppSettings["kCel"]:Obtener el valor de AppSettings del Web.Config

<configuration><appSettings><add key="V1" value="1" /></appSettings>

Si se cambia el web.config se pierden todos los datos ya que se crea una nueva sesión, un nuevo AppDomain

machine.config:Origen de las configuraciones

MachineToApplication:Se pone en el web.config, si tiene esta indicación, solo se puede configurar en el root

MachineOnly:No se puede modificar ni en el root

solo deberíamos utilizar el web.config, no usar un archivo machine.config o modificarlo

type:Propiedad en los TAG del machine.config que indica la clase

<pages validateRequest="true" ></pages> valida que en todas las páginas no se metan scripts como <b>hola</b> en un InputText para pasar un valior a un literal. Se puede poner en el web.config o en las páginas

maintainScrollPositionOnPostBack="true":En la directiva pages, regresando del request se mantiene el scroll en la posición

controlRenderingCompatibilityVersion="3.5|4.0":En la directiva pages, esta propiedad en versión 4.0 genera clases para manejar propiedades como disable en los controles AspNetDisabledAspNetHidden. solo se pone en el web.config y si le ponemos 3.5 se deshabilita con disabled="disabled"

MetaDescription="Apuntes de .Net":en la directiva pages

MetaKeywords="JOCA.MX" En la directiva Pages

CustomErrors solo va a nivel web.config

<customErrors mode="RemoteOnly" defaultRedirect="/error-pages/ErrorDef.aspx">
<error statusCode="404" redirect="/error-pages/Error404.aspx" />
<error statusCode="500" redirect="/error-pages/Error500.aspx" />
</customErrors>

RemoteOnly|Off/On:Cliente solo remoto|Siempre prendido|Siempre apagado

throw new ApplicationException("Hola");Para disparar un error

debug="true"

aspxErrorPath:Variables que se recibe en el querieString en las páginas de error

Manejo de error a nivel C# en la página

Page_Error:Siempre se ejecuta este evento cuando hay un error

Exception ex=Context.Error

ex is ApplicationException

ex.Message

Context.ClearError()Esta instrucción limpia el error y quita el redirect automático

Manejo de error a nivel C# a nivel global.asax

Application_Error:Es el evento

Exception ex=Context.Error.InnerException En lugar de Context.Error, lo demás es lo mismo

Configuration-appSettings configSource="mi.XML"Puedo añadir una configuración a mi página y si se cambia no se crea una nueva sesión

Configuration-location path="miPag.aspx":Las configuraciones dentro de location solo aplican a esa página. se puede poner cualquier configuración para la página

allowOverride="false":No pemrite sobrescribir el contenido del TAG

<configuration> <location path="def2.aspx"> Esta configuración solo aplica para def2.aspx <appSettings> <add key="k1" value="v1"> </appSettings> </location> </configuration>

URL Rewriting

Para hacer el mapping desde web.config - No se recomienda por temas de SEO

desde system.web

<urlMappings><add url="~/privada.aspx" mappedUrl="/Mza15Lte26/Default.aspx" /> <add url="~/pt.aspx" mappedUrl="/ap001_plastitarjetas/Default.aspx" /> </urlMappings>

Desde el Global.asax

Application_BeginRequest:En este evento se cacha la URL

if (path.ToUpper().Equals("/IKER.ASPX")) Context.RewritePath("/apuntes-dotnet/web-config/frm-web-config.aspx"):Redirecciona el Request

La siguiente información cambia cuando hay un queryString o un mapping de URL

Request.Url:http://joca.mx/apuntes-de-dotnet.aspx - URL completo

Request.Path:/apuntes-de-dotnet.aspx - Incluye subdirectorios

Request.FilePath:/apuntes-de-dotnet.aspx - no incluye pathInfo

Request.RawUrl:/apuntes-de-dotnet.aspx - URL externa

Tracing

syste.web trace Se configura para estadísticas en el web.config

enabled="true":Se genera el archivo http://miServer//trace.axd que tiene estadísticas de navegación

pageoutput="true":Se muestra el trace en cada página

mostrecent="true":A partir de los eventos más recientes

RequestLimit="5"Últimos 5 eventos

localOnly="true":no poner en false para evitar hackeos

writetodiagnosticstrace="true":Los eventos se muestran en la ventana output

Trace.Warn("valida","begin") - Trace.Warn("valida","end"):Todos los mensajes que ocurren en medio de esto se ponen en rojo

traceMode="SortbyTime":Ordenar los mensajes

Secuencia de eventos:PreInit-Init-InitComplete-PreLoad-LoadComplete-PreRender-PreRenderComplete-SaveState-SaveStateComplete

Trace:Se puede indicar a nivel página con la directiva Page

Global.asax

Métodos globales y solo existe este archivo en el directoio root

Crea un HttpApplicationObject

Métodos:

Application_Start - Se recibe el primer request

Application_End - Se da de baja el Web Server

Session_Start - Se puede utilizar para inicializar variables de sesión. Podría llevar un contador con una variable static que incremente para ver cuantas sesiones tengo

Session_End - Cuando se abanda la sesión. Podría decrementar de contador de sesiones

Application_BeginRequest

Application_EndRequest

Application_Error

Authentication and Authorization (Forms Authentication)

web.confg directorio:Importante primero el Deny

<system.web> <authorization> <deny users="?" /> <allow users="*"/> </authorization> </system.web>

web.config root:

<authentication mode="Forms"> <forms name="_cookieUsu" timeout="20" slidingExpiration="true" loginUrl="/apuntes-dotnet/Login-secured-02.aspx" defaultUrl="/apuntes-dotnet/principal-secured-02.aspx"> <credentials passwordFormat="SHA1"> <user name="u1" password="02C593FD9AF8254B859D426A76B6CD42847FBEC1"/> <user name="u2" password="F16CA2DFA3688BF08C7A4E21544AF15BD598CB70"/> <user name="u3" password="67FAB92A16D6246960FC2D976E22C426730A2ABF"/> </credentials> </forms>

Using System.Web.Security:Para poder utilizar la programación en C#

FormsAuthentication.Authenticate(txtUsu.Text, txtPWD.Text);Valida el usuario y pwd en web.config. Puedo usar mi propia función

Request.QueryString["ReturnUrl"]:Obtengo la página donde se intentó firmar

FormsAuthentication.DefaultUrl:Página donde está el defaultUrl

FormsAuthentication.SetAuthCookie(txtUsu.Text, chkRecuerda.Checked):Inicio una sesión con ese nombre de usuario. Puedo dejar la cookie persistente

FormsAuthentication.RedirectFromLoginPage(txtUsu.Text, chkRecuerda.Checked):En automático crea la cookie con el usuario y te manda a la página donde se intentó accesar o a la default en caso que no se tenga

name:Nombre de la cookie

User.Identity.IsAuthenticated:Dice si está firmado

User.Identity.Name:Usuario firmado

FormsAuthentication.SignOut():Termina la sesión

timeout:Tiempo en minutos que dura la cookie

slidingExpiration:Si renueva el tiempo en cada request o false si se toma desde el inicio se sesión sin importar la última actividad

FormsAuthentication.HashPasswordForStoringInConfigFile(txtPWD.Text, "SHA1"):Regresa el PWD encriptado con SHA1 o MD5. En el web.config se indica para que lo sepa interpretar

SHA1:160 bit

MD5:128 bit

deny users="?,u1":Se niega a anónimos y u1

Global.ASAX Application_AuthenticateRequest:Siempre se ejecuta este evento al inicir sesión, Aquí se pueden cargar los roles

Request.IsAuthenticated:Indica si el request ya tiene una autenticación

roles = new String[] { "a01", "a02" }:Cadena de roles

Context.User = new System.Security.Principal.GenericPrincipal(User.Identity,roles):Asignar roles al usuario firmado

User.IsInRole("A00"):Preguntar si el usuario tiene un role

deny roles="r1" verbs="post":Para negar la entrada a un role, además verbs indica si solo en post

Authentication and Authorization (Windows Authentication)

Con un active Directory, se utiliza la autenticación de la empresa.

ASP.NET solo hace autorización no autenticación

Es para Intranet no para Internet

La autenticación se hace del lado del IIS Windows Authentication hay que validar Basic Authentication para hacerlo en la computadora personal

En las características de windows se activa Windows Authentication

En IIS se desactiva Anonymus Authentication y debe aparecer Windows Authentication. En las versiones profesionales de Windows

User.Identity.AuthenticationType.ToString(); Da el tipo de Authentication

Encima de la solución, abrimos "open folder in flie explorer" y me copio el directorio

En herramientas administrativas, abro el IIS

Sobre Default Web Site le doy agregar aplicación

Se debe ejecutar VisualStudio como administrador

Le damos opn WebSite y seleccionamos IIS, buscamos la aplicación en Default Web Site

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i Para registrar el IIS

Environment.UserName - Nombre del usuario firmado en Windows

<identity impersonate="true" userName="txtUser" password="txtPWD"/> en el web.config en system.web para tener un usuario genérico

<validation validateIntegratedModeConfiguration="false"/> - Se tiene que activar para que funcione lo de arriba

Si niego todas las páginas en el root para que se tengan que firmar. Puedo poner de inicio una excepción a la de default

<location path="Default.aspx"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>

Application Service Providers(MemberShip, RoleManager y Profile)

Authentication="Forms"

Login Controls-LoginView: Tiene dos templates Anonymous y LoggedIn

Anonymous:Podemos poner el LoginStatus

LoggedInn:Se puede poner LoginName y LoginStatus

<asp:LoginName />: Usuario firmado

<asp.LoginStatus />:Esta etiqueta muestra logout si estoy firmado o login si no lo estoy

<add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>:Se agrega en el web.config del root

ASPNETDB.MDF:Dase de datos por default. Se encuentra en Machine.config

Machine.config:se copian las secciones de connectionStrings, membership, roleManager y webParts al web.config del root

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config - Ruta de Machine.Config

defaultProvider=""Lo establezco para ligar las secciones y personalizarlas a mi proyecto

aspnet_regsql.exe:En el folder de .NET crea los objetos de la base de datos para la seguridad

System.Web.Security.MembershipProvider:Crear una clase heredada de aquí y ponerla en el web.config

Lo importante es que todo este enlazado en el web.config

Las páginas que deberían poder ser accesada como Login o Recuperar Contraseña van fuera del folder de secure de preferencia, de lo contrario el Deny no las va a dejar pasar si no estas firmado

Programar en c#

MembershipCreateStatus status;

MembershipUser user;

user=Membership.CreateUser("jcoroalc", "jcoroalc", "jcoroalc@gmailcom", "miuser", "tuuser",true, out status);

user.ChangePassword("jcoroalc", "otro");

user.GetPassword();

//Response.Write(status.HasFlag(MembershipCreateStatus.Success).ToString());

Response.Write(status.ToString());//Manda el mensaje de si se crea o no el usuario

Roles.CreateRole("miRol");

Roles.AddUserToRole("jcoroalc", "miRol"); //Se pueden agregar de a varios

protected void Authenticate //En este método dejamos de usar el Provider

e.Authenticated=true //Con esto lo dejamos pasar en el control Login

e.Authenticated=false //Prohibimos que pase

AuthenticateEventArgs e - El control login nos da el evento para obtener este parámetro y poder ver si esta autenticado el usuario

protected void CreateUserWizard1_CreatedUser - Con este evento creamos nuestro usuario

Profile Provider:Copio la siguiente sección del Machine.config

Con esto puedo manipular los campos de la base de datos y mantener información de los usuarios que se conectan

En el WebConfig se deben indicar los campos que tiene ese PROFIlE. Es la tabla Profile

<profile DefaultProvider="JocaProfle">

<providers>

<add name="JocaProfle" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

</providers>

</profile>

Con la pura asignación se van guardando los datos

Profile.Profesion="Ingeniero"

Profile.Empresa="Joca"

Los datos se guardan en la tabla separados por ":"

%lt;anonymousIdentification enabled="true"/>-Para que pueda funcionar en el web.config

WebPartManager

Puedes guardar la posición de los controles en la base de datos, así que los puedes colocar donde quieras en la página para cada usuario y guarda la posición.

También puede permitir que con un formulario se muevan las propiedades de los objetos

Por ejemplo para armar páginas como las de https://www.google.com/finance, donde se pueden abrir y cerrar secciones, este control ayuda bastante