Migrando MVC preview v1 a v2 - Cambios Generales
April 25th, 2008
Cambios generales
(fuente: MVC preview 2 Readme)
Cambios en la estructura del proyecto
Agregado de las librerías de MVC v2 y remoción de MVC Toolkit y Web.Extensions 3.6.0.0
-
Hay que remover las librerías MVCToolkit y Web.Extensions 3.6.0.0 y agregar las librerías System.Web.Abstractions, System.Web.Mvc y System.Web.Routing
Agregado de nuevo archivo de Web.Config en el directorio Views
-
Hay que agregar un Web.config en la carpeta views con el siguiente código:
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<remove verb="*" path="*.aspx"/>
<add path="*.aspx" verb="*"
type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<handlers>
<remove name="PageHandlerFactory-ISAPI-2.0"/>
<remove name="PageHandlerFactory-ISAPI-1.1"/>
<remove name="PageHandlerFactory-Integrated"/>
<add name="BlockViewHandler" path="*.aspx" verb="*"
preCondition="integratedMode"
type="System.Web.HttpNotFoundHandler"/>
</handlers>
</system.webServer>
</configuration>
Cambios en el archivo Web.config
Cambio de versión de Web.Extensions v3.6.0.0 a v3.5.0.0
-
Cambiar en el web.config todas las versiones de la librería web.extensions (donde dice 3.6.0.0 hay que poner 3.5.0.0
Remover Bindings y Dynamic Data and Routing Modules and Handlers
-
Remover las dependetAssembly que mapeaba las versiones anteriores de Web.Extensions a la versión 3.6.0.0 (esto está dentro del tag
-
Remover de los tags con namespace System.Web.DynamicData y tagName ~/App_Shared/DynamicDataFields/FilterUserControl.ascx
-
Remover de el tag de System.Web.DynamicData.DynamicDataControlSessions
-
Remover la sección bajo
-
Remover de la sección los modulos de DynamicDataModule y UrlRoutingModule
-
Remover de el módulo UrlRoutingModule.
Nuevo ruteo usando System.Web.Routing
-
En agregar el siguiente código en la sección : <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
-
En agregar el siguiente código en la sección : <add name="MvcScriptMap" preCondition="classicMode,bitness32" verb="*" path="*.mvc"modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" />
<add name="MvcScriptMap64" preCondition="classicMode,bitness64" verb="*" path="*.mvc" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" />
<add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.Routing.UrlRoutingHandler, System.Web.Routing,Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
-
En agregar el siguiente código:<add namespace="System.Web.Routing"/>
-
En httpModules agregar el siguiente código: <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
Nuevos modulos de MVC
-
Agregar el siguiente código en : <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
Cambios en Global.asax
Nueva alta de rutas
-
Se genera un nuevo método que es llamado por Application_Start: protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
} -
El método agrega rutas en una collection: private static void RegisterRoutes(RouteCollection routes)
{
// Note: Change the URL to "{controller}.mvc/{action}/{id}" to enable
// automatic support on IIS6 and IIS7 classic mode
routes.Add(new Route("{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { action = "Index",
id = ""}),
});Cambio de identificación de los parámetros (cambio de [] a {})
Cambio de identificación de los parámetros (cambio de [] a {})
-
Verificar que los parámetros en las rutas estén declarados entre llaves {} y no entre corchetes []: "{controller}/{action}/{id}"
Cambios en Controllers
Remover los tags ControllerAction de los métodos y agregar los tags NonAction
-
Todos los métodos públicos de un controller (a excepción de los constructores) son considerados actions. Hay que remover los tags [ControllerAction] porque no sirven más
-
Todos los métodos públicos de un controller (a excepción de los constructores) que no quieran ser considerados actions deben etiquetarse con el tag [NonAction]
Cambios en Views
Cambios en HtmlHelper y UrlHelper
-
El método ActionLink de HtmlHelper no conserva la firma (string linkText, object values). Estos métodos deben reemplazarse por la firma (string linkText, string actionName, object values) quitando la property Action del objecto values.
-
El método Action de UrlHelper no conserva la firma (object values). Estos métodos deben reemplazarse por la firma (string actionName, object values) quitando la property Action del objecto values.
El método ActionLink de HtmlHelper no conserva la firma (string linkText, object values). Estos métodos deben reemplazarse por la firma (string linkText, string actionName, object values) quitando la property Action del objecto values.
El método Action de UrlHelper no conserva la firma (object values). Estos métodos deben reemplazarse por la firma (string actionName, object values) quitando la property Action del objecto values.
Migración de MVC preview v1 a v2 - Creando un ViewUserControl base
April 24th, 2008
Base Controller y Base View
Escribir un controller base desde el cual heredan los controllers y una view base desde la cual heredan todas las views tiene muchos beneficios. Aquí presentamos algunos que se vuelven particularmente interesantes al momento de migrar de MVC v1 a v2.
Reescritura de HtmlHelper.ActionLink y UrlHelper.Action
Como vimos en el post anterior, el HtmlHelper.ActionLink y el UrlHelper.Action perdieron 2 firmas, lo que implicaría cambiar TODAS las llamadas a los métodos ActionLink y Action que usen esa firma en TODAS las views. Si existiera una view base de la cual hereden todas las views, una solución a este problema es sobreescribir las property Html y Url de la view Base con clases que hereden de HtmlHelper y UrlHelper y que implementen los métodos ActionLink y Action con los parámetros anteriores. No es una solución prolija, pero en caso de tener muchas views es mucho más rápida que cambiar todas las vistas. El código sería el siguiente:
Reemplazo de OnError por HandleUnknowAction
Antes
Después
Cambio de OnPreAction por OnActionExecuting
Antes
Después