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();
F12 - para que aparezca la consola en CHROME y console.log('mensaje')
c-=a es c=c-a, c+=a es c=c+a
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
ID.addEventListener('change', function() {} Agregar un evento a una etiqueta. Puedo poner el ClientID
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
| Location | Secured | State Shared Across Pages | Across Clientes |
Static | Server | Yes | Yes | Yes |
Application | Server | Yes | Yes | Yes |
ViewState | Client | Yes (encrypted) | No | No |
HiddenField | Client | No | No | No |
QueryString | Client | No | Two Pages | No |
Context | Server | Yes | No (Request Only) | No |
Cookies | Client | No | Yes | No |
Session | Server | Yes | Yes | No |
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:https://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
Data Binding(SqlDataSource - AccessDataSource) GridView
En el menú de Datos está el control de SqlDataSource
Si se arrastra en modo diseño la tabla, se crea el SqlDataSource y su GridView
Se le pueden dar opciones de insertar, eliminar, editar, además de auto format
GridView - datasourceID:Para inidicar el SqlDataSource que pertenece
AutoGenerateColumns="true":Opción por default
BoundField - String
CheckBoxField - La columna debe ser boolean o sea un bit
CommandField - Le escribes show y aparecen los tipos de botones
DataKeyNames="f104_mes" - Defino el campo del cuál voy a obtener el valor cuando seleccione el registro
GridView1.SelectedValue - Valor del campo definido en DataKeyNames
GridView1.SelectedDataKey.Values["f104_monto"] -
Para obtener varios nombres de campos en DataKeyNames="f104_mes, f104_consecutivo, f104_monto". El único
tema aquí es que el edit y delete toman los campos llaves de aquí, así que es importante que coincidan así
que quizás no es tan buena idea usar este campo para seleccionar con el selecteDataKey
GridView no soporta el comando INSERT, aunque este en las propiedades, hay que quitarlo
<asp:CommandField ShowEditButton="true" ShowDeleteButton="true" ShowCancelButton="true" />
Conectarte a una BD
SqlConnection conn = new SqlConnection();
Del Webconfig podemos traer el datasource
using System.Data.OleDb;Si es con access
OleDbConnection conn = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand(sb.ToString(), conn);
OleDbDataAdapter sda = new OleDbDataAdapter(cmd);
using System.Data;
using System.Data.SqlClient; Si es conSqlServer
conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["JocaSQL"].ConnectionString;
SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
conn.Open();
Llenar un <Table>
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read()){ sdr["miCampo"] }
sdr.Close();
conn.Close();
Llenar un GridView
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds, "tblActividad");
GridView4.DataSource = ds.Tables[0].DefaultView;
GridView4.DataBind();
Si lleno en el Page_Load, hay que condicionar el IsPostBack o pierde los datos recien capturados
DataBind():Para pintar eñ GridView. Primero se debe cargar con datos ya sea manual o automático
gv_Sorting:En el evento Sorting es importante poner el DataBind();
SortDirection se debe programar
dv.sort();
e.sortExpression
e.sortDirection
SortDirection.Ascending/Descending
gv.Attributes["SortField"]=e.SortExpression
gv_SelectedIndexChanged:Este evento funciona si se le dio la opción select al GridView
gv.SelectedValue:Si se tiene asignado el DataKeyNames de ahí saca el primer campo si es que hay varios
gv.Rows[gv.SelectedIndex].Cells[2].Text:Saca el valor seleccionado
La forma de tomar el renglón cambia dependiendo el evento
gv_SelectedIndexChanged - SelectedIndex
gv_RowCancelingEdit - gv1.EditIndex = -1; //Cancelar la edición
gv_RowEditing - gv1.EditIndex = e.NewEditIndex; //Seleccionar el renglón
gv1_RowUpdating - e.RowIndexe.RowIndex; //Actualizar el renglón
gv1_RowDeleting - e.RowIndex
gv1.EditIndex = -1; //Darle foco al renglón que estaba, si es -1 pues al inicio
CheckBox chk=(CheckBox)GridView1.SelectedIndex].Cells[5].Controls[0]: Cells tiene que ver con el orden de las columnas, empieza en 0
cmd.Parameters.AddWithValue("@f002_csi", ((TextBox)gv1.Rows[e.RowIndex].Cells[2].Controls[0]).Text);
cmd.ExecuteNonQuery();
ButtonField - HyperlinkField (con QuerieString)
gv1_RowCommand - Convert.ToInt32(e.CommandArgument):Para obtener el renglón
e.CommandName - Obtener el botón que se presionó y hacer la respectiva programación
DataNavigateUrlFields="Id1, Id2" - {0} {1}
DataNavigateUrlFormatString="/joca/menues-detalle.aspx?f011_menu={0}&f011_opcion={1}"
DataTextField:Para que despliegue el valor del campo como título del link
ImageField DataImageUrlField="CampoDato" DataAlternateTextField="OtroCampo"
DataImageUrlFormatString="/img/f{0}.jpg" ControlStyle-Width="30"
GridView.Attributes["miAtr"] -Sirve para guardar como variables de sesión
RowEditing, RowCancelingEdit, RowUpdated (cuando se actualiza el registro) - Cuando se presionan esas opciones
en el gridview, puede servir para activar o desactivar el DetailsView
browser | WebServer | | Database |
<table> | GridView | DataView | Tabla |
<tr> | GridViewRow | DataRowView | Record |
<td> | GridViewColumn | DataColumn | Field |
DetailsView
Falta practicar esta parte
Se despliega en vertical en vez de horizontal
<fileds></fileds> en vez de columns
En el where le digo que del source en control
ModeChanged:
dv.CurrentMode=DetailsViewMode.ReadOnly
gv.enable="true"/false
ItemUpdated: Hacer algo cuando se actualiza como - gv.DataBind()
ItemInserted: Hacer algo cuando se inserta como refrescar el gv
Manejar excepciones en los eventos anteriores:
if (e.Exception!=null) se rescata e.Exception.Message
e.ExceptionHandled=true - No marca le excepción
e.KeepInEditMode=true - Permite Corregir en update
e.KeepInInsertMode=true - Permite Corregir en Insert
TemplateField
Falta practicar esta parte
En Design Mode - Convertir el field en TemplatedField con esto da las siguientes dos opciones
EditItemTemplate: Modo de edición, puedo dar un validador
ItemTemplate: Sección de lo que muestra
UnObstrusiveValidationMode: Hay que agregar esta opción
bind: Lee y escribe en el parámetro @miCampo del Querie. Two Way Binding
Text='<%# bind("miCampo") %>'
Eval No actualiza el valor al campo, no es en dos sentidos. Sirve para mostrar
o mandarlo de parámetro en alguna funcion que regrese alguna descripción para un ID por ejemplo
Text='<%# eval("miCampo") %>'
Text='<%# TraeNombre(eval("miCampo")) %>' El parámetro debe ser de tipo Object y se debe usar el Cast
Botón Eliminar: En ItemTemplate hacer lo siguiente
1- Poner un LinkButton
2- Text="Delete"
3- OnClientClick="return confirma()" - Para una función de JavaScript
4- CommandName="delete" ya sabe el control interpretar este evento con este texto
En Item van los comandos
HeaderTemplate - Encabezados de la columna
FooterTemplate - Footer de la columna
DataView
Falta practicar esta parte
DataView dv;
SqlConnection conn;
SqlDataAdapter da(select * from tabla, conn)
DataSet ds=new DataSet();
da.Fill(ds,"miDs");
dv.ds.Tables[0].DefaultView;
Las 5 líneas anteriores se pueden sustituir con:
DataSourceSelectArguments args=new DataSourceSelectArguments();
dv=(DataView)sds.Select(args); sds - es el datasource aquí va el método select
dv.RowFilter="miCampo="+sValor;
DataRowView drv=dv[0];
return drv["miCampo"];
Cuando le de Edit poner el ID porque el EditItem tiene otro valor
Pongo un DropDownList selectedValue='<%# Bind("miCampo") %>'
DataTextField
DataValueField
Lo anterior con un SqlDataSource para la subtabla
Al DropDownList le asigno el datasource en EditItemTemplate
Tipo Decimal: Para montos de dinero
AJAX - Asynchronous JavaScript and XML
Para hacerlo con puro código de JAVASCRIPT
objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
Para hacerlo con controles
Para que la página tenga el script: <asp:ScriptManager ID="ScriptManager1" runat="server">
Aquí se meten los controles: <asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate>
En el UpdatePanel la propiedad UpdateMode=Conditional para que solo los controles que estàn en ese updatePanel se actualizan
en la propidad triggers, le puedo indicar un control fuera del updatepanel para que actualice lo de ese panel y no los de afuera.
Se pone el control y el evento
ChildrenAsTriggers=false, solo los especificados como triggers se actualizan
RenderMode para itilizar SPAN Label
<body onload="window.history.forward();"> desactivar boton de back
UpdatePanel1.update() Actualiza el panel desde programaciòn
UpdateProgress - Se asocia a un panel, se le pone la propiedad displayAfter, y los controles o etiquetas
que se pongan dentro de este panel se haràn visibles durante este tiempo cuando se actualice el panel asociado
dynamicLayout=false, entonces el update progress ocupa espacio
Timer-Interval en milisegundos - El código se repite cada cierto tiempo,
tengo que ponerlo dentro de un update panel y ponerle
conditional para que no actualice los demas update panel. Usar el evento OnTick()
String sTime = "alert('"+DateTime.Now.ToLongTimeString()+"');"; Variable con JavaScript
Incluir el JavaScript con control fuera del UpdatePanel
Page.ClientScript.RegisterStartupScript(typeof(Page), "k1", sTime,true);
Incluir el JavaScript con control dentro del UpdatePanel
GetType():Obtener el tipo de control
ScriptManager.RegisterStartupScript(btnShowTime, UP4.GetType(), "k1", sTime, true);
EnablePartialRendering="false": quita la funcionalidad de AJAX en la página. Va en scriptManager
ScriptManager.AddHistoryPoint()En el evento Navigate se va agregando